InCTF 2018 S3cur3 Bank

CTF/Writeup 2018. 10. 8. 10:36

문제에 들어가보면 아래오 같이 생성한 계정별로 두 개의 계좌에 각각 1000원씩 돈이 입금되어있다. 즉 총 2000원이라는 돈이 존재하는데 문제에서는 flag를 구매하기 위해 5000원이 필요했다. 별다른 웹 취약점들이 존재하지 않지만 두 개의 계좌에서 서로 반대쪽 계좌로 돈을 보낼 때 race condition이 터지면서 돈을 무한대로 충전할 수가 있었다.


대충 아래와 같은 느낌으로 시나리오를 만들어봤다.

1. a 계좌에 0원 b 계좌에 2,000원을 옮겨놓는다.

2. a 계좌에서 b계좌로 100원씩 계속 반복해서 보내는 요청을 약 10개의 스레드로 시도해 놓는다.

3. b 계좌에서 a계좌로 10원씩 계속 반복해서 보내는 요청을 1개의 스레드로 시도해 놓는다.

4. 위의 상황에서 b 계좌에서 a계좌로 10원씩 보낸 금액이 더해져 a계좌 총액이 100원이 되면 정상적인 상태라서는 a 계좌에서 b계좌로 다시 100원만 전송이되어야 함. 

그러나 현재 잔액 확인 -> 금액 전송 -> 현재 잔액에서 보낸 금액 제외라는 3단계 과정에서 우리는 매우 많은 스레드를 통해 a계좌->b계좌 요청을 만들어 놨기 때문에 하나의 요청이 금액 전송 후 현재 잔액에서 보낸 금액을 제외하는 단계까지 가기 전에 다른 요청이 한번 더 현재 잔액확인 -> 금액 전송단계를 밟아서 실제로는 잔액이 100원만 있었는데 200원이 전송되는 형태의 race condition 공격이 가능해짐.


위 시나리오대로 아래와 같이 진행했다.



1) 현재 잔액 a계좌 0원 , b계좌 2000원




2) a계좌에서 b계좌로 300원씩 1,000번 반복해서 보내는 요청을 버프 인트루더로 10개 생성




3) b계좌에서 a계좌로 30원씩 600번 반복해서 보내는 요청을 버프 인트루더로 1개 생성




4) 양쪽 요청이 모두 끝난 후 계좌에 5,000원 이상 금액이 입금되어있는 것을 확인.



5) 충전한 금액으로 플래그를 사면 됨.




'CTF > Writeup' 카테고리의 다른 글

InCTF 2018 TorPy  (0) 2018.10.08
InCTF 2018 WildCat  (0) 2018.10.08
InCTF 2018 The Most Secure File Uploader  (0) 2018.10.08
D-CTF Quals 2018 secops  (0) 2018.09.26
D-CTF Quals 2018 Get Admin  (0) 2018.09.24
블로그 이미지

JeonYoungSin

메모 기록용 공간

,