나는 내가 하고 있는 일을 자동화하기 위해 Safe Gaming 웹사이트를 통해 작업해 왔습니다.균열 도구. 그런데 그 과정에서 문제가 생겼습니다. 익스플로잇 문자열을 사용하여 서버에서 취약한 프로그램을 실행하려고 하면 내 컴퓨터의 Python 2.7 스크립트 사이 어딘가에서 변경되어 나에게 다시 돌아옵니다.
이 특정 과제에 접근하는 일반적인 프로세스는 다음과 같습니다.
- SSH 연결 시작
- SSH 연결을 통해 쉘을 열고 "/bin/bash", "/bin/sh"를 시도했습니다.
- 메시지를 받을 때까지 기다려 주세요.
- "%s %s" %(program_on_server, payload_string) 형식으로 명령을 보냅니다.
내 페이로드 문자열은 여러 번 반복되는 "\x74\x84\x04\x08" 바이트입니다. 내가 겪고 있는 문제는 서버가 실행 중인 셸에 보낸 내용을 에코하면 "\x74\x84\x07\x08\x1b\x5b\x4b"로 변환된다는 것입니다. 문제를 해결한 후에도 추가 바이트가 어디서 나오는지, \x04가 \x07이 되는 이유를 알 수 없습니다. Pwntools는 올바른 바이트를 보내고 있다고 생각하는 것 같고 디버그 출력에는 최소한 올바른 바이트가 표시되므로 문제는 ssh에서 bash, 취약한 프로그램에 이르는 체인의 서버 측 어딘가에 있다고 생각합니다. 따라서 pwntools와 더 관련된 곳이 아닌 여기에 게시하십시오. 이 문제의 원인과 원인을 아는 사람이 있습니까?
아래는 로그인 정보가 있는 함수를 포함하는 코드입니다.
#!/usr/bin/python2
from pwn import *
context.log_level = 'debug'
def makePayloadString():
return p32(0x8048474)* 20 # p32 takes a 32 bit number and converts it to bytes
sshConnection = ssh(user=getUser(), host=getHost(), password=getPassword())
command = "%s %s" % (getProgramLocation(), makePayloadString())
shell = sshConnection.shell("/bin/bash")
shell.recvuntil("$ ", timeout=10)
shell.sendline(command)
shell.recvline(timeout=10)
답변1
서버 측에서 반환하는 바이트는 셸에서 나오는 것으로 보이며 마치 터미널 세션에 입력된 것처럼 입력 바이트에 반응합니다.
0x84가 7비트가 아닌 ASCII 코드로 해석되는지는 확실하지 않지만 0x04는 Ctrl-D(EOF) 문자와 동일하며 줄 시작 부분에 입력하지 않으면 bash는 이를 거부합니다. Bash는 종소리(경고음)를 울리기 위해 0x07(BEL) 문자를 터미널에 보냅니다. 0x08은 백스페이스(BS) 문자이고 bash는 입력 커서를 한 칸 뒤로 이동시키는 ANSI 이스케이프 시퀀스(ESC[K)(\x1b\x5b\x4b)를 에코합니다.
대화형 터미널에서 "t" 문자를 입력해 보면 보이는 프로그래밍 출력의 대략적인 모습을 재현할 수 있을 것입니다.
어쩌면 이 바이트를 bash나 sh 대신 다른 프로그램의 입력으로 보내야 할까요?