본문 바로가기

5. 방학 활동/Write UP

[2023.07.23] 워게임 문제풀이(2) - 2

목차

  • 포렌식
  • 리버싱
  • 웹해킹

 

포렌식

  • xcz.kr - Prob24
  • xcz.kr - Prob27

 

문제 1 : xcz.kr - Prob24

👾 어느날 나는 커피집에서 노트북을 놓고 잠시 자리를 비웠다.
그리고 다시 와서 작업을 하다가 작업프로그램이 갑자기 꺼졌고, 작업파일들이 모두 다 삭제되었다.
원인을 찾기위해 나는 서둘러 메모리 덤프를 만들었다.
이 메모리 덤프파일을 분석하여 다음 정보를 알아내자.
키 형식 : (Process Name_PID_Port_Process Execute Time(Day of the week-Month-Day-Hour:Min:Sec-Years)
ex (explorer.exe_1234_7777_Mon-Jan-01-12:00:00-2012)

 

메모리 덤프는 응용 프로그램 또는 시스템 충돌시 메모리 내용을 표시하고 저장하는 프로세스로, 주로 운영 체제 내에서 문제나 오류를 식별하거나 시스템 내에 설치된 응용 프로그램을 식별한다.

 

파이썬 스크립트 언어로 제작된 오픈소스 메모리 포렌식 도구인 볼라틸리티(Volatility)를 이용해 문제를 풀어보겠다.

 

먼저 문제에 첨부된 파일을 다운 받는다.

 

 

먼저 두 개의 파일 중 xczprob2.7z.001을 풀어서 나온 xczprob2 파일을 volatility로 분석해보겠다. imageinfo를 살펴보자.

 

 

이 파일은 winXP 운영체제를 사용한다.

 

flag에 프로세스 이름을 넣어야 하니, psscan 이용해 프로세스 정보를 확인해본다.

 

 

이것만으로는 정보가 부족해 connections 이용해 Active한 TCP 연결에 대한 정보를 조회한다.

 

 

Pid가 1124인 한 개의 프로세스가 사용된 것을 확인할 수 있다. 위의 psscan에서 Pid가 1124인 프로세스를 찾아보니 “nc.exe”이다.

 

flag: nc.exe_1124_80_Fri-Nov-02-09:06:48-2012

 

 

문제 2 : xcz.kr - Prob27

👾 어느 날 해커 'FORENSER' 는 BOSS 의 명령을 받고 계획까지 치밀하게 세운 뒤,
"XCZ" 라는 회사의 내부에 침입하여 기밀문서를 찾아 외부로 유출하는 과정 중 현장에서 발각되었다.
조사 중에서도 죄의식을 느끼지 못하고 질문에도 답하지 않고 물어보았자 시간을 버리는 일이었다.
결국 참다 못해 직접 나서서 찾기로 하였다.
증거를 찾을 수 있는 단서는 'FORENSER' 가 가지고 있던 하드디스크 하나. 나는 일단 하드디스크에서 증거가 될 수 있을만한 것을 추려내었다.
키 값을 찾으세요.

 

먼저 문제에 첨부된 파일을 다운받아 압축을 풀면 파일이 엄청나게 많은 것을 확인할 수 있다.

 

 

이 수많은 파일 중 Outlook Express 파일에 집중해보았다. 마이크로소프트의 전자 메일 시스템인 Outlook은 기밀 문서를 유출할 확률이 높기 때문이다.

 

 

dbx 확장자 파일을 열어보기 위해서 dbx viewer을 다운로드한다.

https://www.freeviewer.org/outlook-express/

 

Free DBX Viewer to Open, View & Read Outlook Express DBX Emails

Microsoft Outlook Express and DBX Files Outlook Express is a former email client developed by Microsoft that uses DBX files to store mailbox information. Every Outlook Express folder corresponds to a DBX file and these files are saved on the system hard dr

www.freeviewer.org

 

 

confidential.doc 파일을 오픈해보자.

 

 

첨부파일을 열어보니 위와 같은 메시지가 나타났다.

 

 

우클릭을 한 후 모두 선택을 해보았다. 맨 마지막 부분에 보이는 글씨는 없는데, 무언가가 선택된 것을 확인할 수 있다. 그대로 복사를 한 후 메모장에 붙여넣기 해보았다.

 

 

마지막 줄에

11.19 New Forensic Prob27[150] auth key is Out10OkExpr3s5M4i1

 

flag : Out10OkExpr3s5M4i1

 

리버싱

  • 레나튜토리얼 2번 풀이 - reverseMe.exe
  • Dreamhack : rev-basic-0 풀이

 

문제 1 : 레나튜토리얼 2번 풀이 - reverseMe.exe

 

 

reverseMe.exe 파일을 실행하면, 라이센스를 새로 구입하라는 문구가 출력된다.

 

 

OllyDBG에 파일을 올리고 분석해보면 “Keyfile.dat” 파일이 있는지 확인한 후 점프를 결정하는 것을 볼 수 있다.

 

 

만약, “Keyfile.dat” 파일이 없으면 EAX에 -1를 저장해 [0040107B]에서 점프를 하지 않고, 파일이 있으면 점프를 한다.

EAX의 값과 -1을 비교한다. 만약 파일이 있으면 JNZ 문을 통해 점프하고, 파일이 없으면 점프하지 않는다.

Keyfile.dat 파일 생성

 

임의의 값 “1234567”을 적고 저장한다.

 

메모장으로 “Keyfile.dat” 파일을 생성하고 임의의 값 “1234567”을 적고 저장한다.

 

 

그 후, reverseMe.exe를 실행해보면 위와 같이 출력된다.

 

 

올리디버거를 다시 실행해 확인해보면, [402173] 주소에 저장된 값과 10을 비교한다.

 

 

Ctrl+G로 [402173] 주소에 저장된 값을 확인해보니 “7”이 저장되어 있다. “Keyfile.dat”에 저장된 byte의 값인 것 같다.

 

 

JL문을 통과하기 위해서는 [402173] 주소의 값이 10보다 더 커야할 것이다. 이때, 10은 16진수의 10을 의미하므로 16byte의 값 이상을 저장해야 한다.

“Keyfile.dat” 파일을 16byte 이상 저장한다.

 

 

올리디버거를 재실행하고 코드를 한 줄씩 실행해보니, “Keyfile.dat” 파일에 넣어준 byte 값만큼 반복이 되는 것을 확인할 수 있었다.

 

 

먼저, EBX와 [40211A] 주소의 값을 더해 AL에 저장한다.

 

 

[40211A] 주소의 값을 확인해보니, “Keyfile.dat” 파일에 저장한 값이 저장되어 있다.

 

 

EBX의 값(윗 줄에서 0으로 초기화 되었으므로 0)과 “Keyfile.dat” 파일의 첫 번째 문자인 숫자 1의 아스키 코드 값인 31이 더해져 저장된 것을 확인할 수 있다.

 

 

따라서, AL의 값과 0이(아스키 코드 값으로 NULL)이 다르기 때문에 JE 분기문이 실행되지 않는다.

 

 

다음, AL 값과 47을 비교한다. 이때 47은 아스키 코드 값으로 “G”이다. AL 값과 47(”G”)이 같으면 JNZ 분기문이 실행되고, ESI와 EBX 값이 1씩 오를 것이다. 또, AL 값과 47(”G”)가 다르면 EBX 값만 1씩 오를 것이다.

 

 

그 다음, [4010C1] 주소로 점프하며 “Keyfile.dat” 파일에 넣어준 byte 값만큼 반복된다.

 

 

반복문을 끝내고 나면, ESI 값과 8(아스키 코드 값으로 숫자 8)을 비교한다. 즉, 문자 “G”가 8개면 JL문을 통과하고 JMP문을 실행할 것이다.

 

 

“Keyfile.dat” 파일에 “G”를 8개 저장한다.

 

 

실행해보면 ESI가 성공적으로 8이 된 것을 볼 수 있다.

 

 

“You really did it! Congratz !!!” 문자열이 출력된다.

 

 

문제 2 : Dreamhack : rev-basic-0 풀이

 

 

처음 프로그램을 실행하면 Input에 값을 입력하도록 되어있고, “Wrong” 문자열이 출력된다.

 

 

x64dbg를 이용해 코드를 확인해보면, [00007FF73F1214EF] 주소에서 “Input :” 문자열이 출력되는 것을 확인할 수 있다.

 

 

“123”을 입력하고 다시 x64dbg에서 코드를 한 줄씩 실행해보면, “Wrong” 문자열이 출력된다.

 

 

이때, [00007FF73F1214F4] 주소 이후로 프로그램이 종료되기 때문에 [chall0.7FF73F121100] 주소에 “Correct”와 “Wrong” 문자열이 존재한다는 것을 유추할 수 있다.

 

 

[chall0.7FF73F121100] 주소의 모습이다. “Input :” 과 “Correct”, “Wrong” 문자열이 존재한다.

 

 

[00007FF73F121153] 주소에서 두 문자열을 비교하므로 [chall0.7FF73F121000] 주소에 “Correct”를 출력하는 문자열이 있을 것이다.

 

 

[chall0.7FF73F121000] 주소의 모습이다. 오른쪽을 확인해보니 flag 값으로 보이는 문자열이 존재한다.

 

 

해당 문자열을 입력하니, Correct가 출력된다.

 

웹해킹

  • webhacking.kr의 old-49번 문제 
  • webhacking.kr의 old-58번 문제

 

문제 1 : webhacking.kr의 old-49번 문제

SQL INJECTION에 관한 문제임

 

1. 문제를 보고 어떻게 풀어야 하는지 분석하기

  • SQL 인젝션에 관한 문제
  • level이 있는 것으로 보아 소스코드에 level과 관련된 내용을 주의깊게 볼 필요가 있음

 

2. level칸에 1입력하고 출력 반응보기

3. 소스코드 분석하기

  • <php>코드 부분을 살펴보면 lv를 GET방식으로 입력받고 결과값을 출력해줌
  • 출력된 아이디가 admin인 경우 풀리는 소스코드라는 것을 분석하였음
  • vl파라미터는 select, or, and, \(, \), limit, ,(쉼표), \/, order, cash, , \t, \', \"가 필터링되며, 입력값을 작성할 때에는 앞의 문자들을 우회하여 작성하여야 함
  • id가 admin일 경우 풀리는 문제이기에 id가 admin을 선택할 수 있도록 lv값을 조작하여 작성하여야 함. 그러나 \’, \”을 필터링 하고 있으므로 id='admin' 또는 id="admin”을 입력할 수 없음

 

4. 문제 해결하기

  • 문제를 해결하기 위해 admin을 우회하여 표현할 수 있는 방법으로 hex값을 사용하였음
  • hex값 = 16진수 표기법

 

 

  • 1&&id=0x61646d696e을 입력하면 문제가 풀림 (필터링으로 인해 and, or를 사용할 수 없음)

 

 

문제 2 : webhacking.kr의 old-58번 문제

58번 문제 화면

 

1. 아무 값이나 입력해보기

  • d라는 값을 입력하고 Send버튼을 눌렀더니 d: command not found이라는 문자가 출력되었음

 

 

  • 이후에도 admin, guest, web 등의 문자를 입력했지만 command not found라는 문자가 계속해서 출력되었음 그러나, flag를 입력하였을 때는 기존과 다르게 permission denied… admin only라는 문장이 출력되었음을 확인했음
  • 리눅스 명령어인 help도 입력하였더니 아래의 사진과 같은 결과가 나왔음

 

 

help명령어를 사용하여 ls, id, flag, help명령어를 사용할 수 있다는 사실을 알고 모두 입력해보았음. ls명령어를 통해 index.js, temp.html파일이 있음을 알 수 있었고, id명령어를 통해 식별자에 관한 메시지가 출력되었음

 

2. 소스코드 살펴보기

 

  • 소스코드를 살펴보니 현재 username이 guest인데 해당 권한을 admin으로 변경하여 flag 명령어를 실행하면 해당 문제가 풀릴 것임
  • 스크립트안에 socket io로 서버와 송수신하는 것이 구현되어 있음

*Socket.io는 웹 소켓을 지원하는 JavaScript 라이브러리이며, 실시간 웹 애플리케이션을 구축하기 위해 사용됨. 해당 라이브러리는 서버와 클라이언트 간 양방향 통신을 제공하는 기술로, 실시간 데이터를 전송하고 받을 수 있게 해줌

  • socket = io(); 를 통해 새로운 소켓을 생성해주고 emit()을 통해 메시지를 내보냄
  • socket.emit을 살펴보면 username:을 보내는 명령어 구조로 되어있는데 위에서 admin만 플래그 값을 볼 수 있다고 했으니 admin:flag로 메시지를 보내면 flag값을 얻을 수 있을 것임

 

3. 문제 해결하기

  • username을 admin으로 바꾸기: flag값을 확인할 수 있는 권한은 admin에게만 있음
  • $('#m').val()이 입력값이니까 이를 flag로 바꾸기

 

 

  • F12 console창에서 바꿔주고 원래 문서로 돌아와 flag를 입력 후 send를 누르면 권한이 admin으로 바뀌어 flag값이 출력됨