Post

미니모의해킹 대회 Write up

개요

여름방학기간에 학교에서 약 3주간 진행이 됐던 모의해킹 실습교육 후 수강생들을 대상으로 한 해킹대회를 참여했습니다. 따라서 이번 Write up에서는 대회에 마지막 정답까지 찾아내는 과정에 대한 내용들을 작성했습니다. (해당 Write up은 이형우팀원과 함께 작성이 됐습니다.)

해당 공격은 대회에서 나누어준 가상머신을 대상으로 진행이 되었습니다.

해당 공격 기법들을 허가되지 않은 실제 운영 서버에서 시도하는 것은 정보통신망법에 어긋나는 행위입니다.

1. 공격전 분석

Nmap을 활용한 IP, PORT 스캐닝

공격을 하기 전 공격 서버의 iP와 열려있는 port가 어떤것이 있는지 Nmap을 통해 확인을 했다. ifconfig으로 확인한 결과 현재 공격자 시스템의 ip는 192.168.5.128이다.

image

Vimtim시스템의 Ip를 알아내기 위해 nmap -sP 192.168.5.0/24 명령어를 통해 192.168.5.0 부터 192.168.5.255까지의 IP를 하나씩 Ping을 날려 스캔을 했다.

image

결과로 사진과 같이 1, 2, 133, 254, 128번 IP가 현재 사용중이라는 것을 확인했다. 여기서 1번은 기본 게이트웨이의 주소이고 2, 254는 VMware에서 기본적으로 사용을 하는 번호이고, 128은 현재 사용하는 주소이니 남은 IP인 133번 ip가 Victim시스템의 ip라는 것을 알아냈다. 만약에 또 다른 시스템들이 가동중일 경우에는 여러 ip들 하나하나 분석을 해가면서 Victim시스템을 찾아야 하지만 지금은 그럴 필요가 없으므로 생략을 했다.

다음으로는 해당 ip에서 열려있는 port를 스캔해야한다. nmap -A 192.168.5.133명령어를 이용해서 스캔을 진행했다. 여기서 -A 옵션은 해당 ip의 전체적인 내용을 스캔한다.

image 스캔을 한 결과 22번 포트의 SSH, 80포트의 HTTP가 열려있는것을 확인했다. 이때 OpenSSH 7.6p1의 취약점을 찾아 exploit을 노려볼 수 있지만 이전에 강사님께서 너무 취약점만 찾아보려하지말고 시스템에 연결할 수 있는 여러 방법들을 찾아보라는 말이 떠올라 ssh는 아직 id와 password를 모르기에 넘기고 브라우저를 통해 80번포트로 연결해 분석을 해봤다.

80번 포트 분석

브라우저를 통해 해당 ip의 80번 port로 접속한 결과 매우 익숙한 UI가 보였다. 이전에 학습을 했던 DVWA인 웹 취약점 어플리케이션과 똑같은 모습의 화면이였다.

image

2. 취약점 공격

SQLinjection

따라서 아직 다 완성이 되지는 않았지만 이전에 작성했던 SQLinjection Write up에서 사용했던 명령어를 바로 사용했다. 이전 과정들을 더 알고싶다면 이 블로그의 SQLinjection Write up을 참고하면 된다. ' union select user, password from users-- - 해당 명령어를 입력한 결과 다행이 DVWA에서 사용중인 DB를 똑같이 사용하고 있었고, 이 DVWA에는 kangon, knustar, admin이라는 계정이 각각 3b5fca91e8651c867303c6350135f4ad, 10238d6114894bb5edc39981835bbec9, e99a18c428cb38d5f260853678922e03 라는 비밀번호를 사용중이라는 것을 확인했다. 비밀번호가 숫자와 영문자로만 이루어져있는것을 봐서 해쉬화가 되있다는 것을 예측할 수 있었다. 알아낸 해쉬화된 패스워드들을 Hashes.com에 넣어본 결과 각각 chuncheon, university, abc123이라는 해쉬화가 되기전의 비밀번호를 알아냈다.

Credential stuffing

이 계정들을 22번 포트 ssh에 크리덴셜 스터핑(발견한 계정을 다른 곳에서 로그인을 시도하는 것)을 해본결과 admin과 knustar는 실패했지만 kangwon은 DVWA에서 사용하던 아이디와 패스워드를 그대로 사용하고 있어 접속에 성공했다.

image

3. 목표 재설정

hint?

처음 접속을 한 후 ll을 한 결과 hint.txt를 발견했다.

1
search abcd

이 텍스트의 내용을 따라 abcd라는 파일이 있는지 find를 이용해 찾아 봤다. find / -name *abcd* 2>/dev/null 이 명령어를 하나씩 보자면 /는 루트디렉토리 /부터 해당 파일을 찾겠다는 의미고 -name *abcd*는 abcd 가 들어간 이름의 파일을 찾겠다는 의미이다. 마지막 2>/dev/null에서 2는 표준에러로 에러메세지를 출력하는 것이다. 따라서 해당 명령어를 사용하면서 출력된 오류 메세지들은 /dev/null로 버려버린다는 의미이다.

image

결과로 /usr/local/games/abcd.zip이라는 파일을 발견했다. 해당 파일을 다운받아 압축을 풀어보려 했지만 322로 root소유의 파일로 되있는것이였다. 하지만 현 계정에서 sudo -i를 해본결과 sudo권한이 있어 root 계정을 획득할 수 있었고 zip파일을 윈도우에서 실행을 시켜보기위해 /var/www/html 위치에 옮겨줘 윈도우에서 다운을 받았다.

ZIP파일 분석

ZIP파일을 풀려 실행을 했지만 파일이 손상이되어 압축을 풀 수 없다는 오류메세지가 출력이 됐다. 해당 파일을 HxD프로그램으로 핵사값을 확인한 결과 zip의 헤더가 보이지 않았고 abcd.exe를 내포하고 있다는 것을 확인했다.

image

4. 파일 복구

ZIP파일 복구

image

위 사진인 ZIP파일의 헥사값 예시를 보면 반복적인 부분을 확인 할 수 있다.

image

찾았던 ZIP파일의 헥사값에 마지막 부분을 보면 ZIP파일의 구조가 대략적으로 빨간 박스와 유사하다는 점을 이용하여 파일헤더를 재구성해야한다.

image

image

image

위 그림들처럼 파일의 헤더부분에 빠진 파일 시그니처를 확인 할 수 있었고, 파일 헤더를 수정 할 수 있었다. 하지만 마지막 부분의 PK.. 50 4B 01 02 와 PK.. 50 4B 03 04는 다른 값이다.

따라서 이렇게 헤더를 해당 파일에 맞게 다시 구성해 넣어줘 ZIP파일을 정상적으로 복구했다.

image

하지만 abcd.exe파일을 실행했지만 실행이 안됐다.

abcd.exe 파일 복구

이 또한 HxD프로그램으로 파일 시그니처를 확인한 결과

image

image

실행파일처럼 보이지만 빨간 박스부분에 JPG파일의 시그니처가 보이는것을 확인했고 앞 4D 5A 90 00을 삭제해 정상적인 jpg파일로 수정을 했다.

정상적으로 복구를 한 후 확인한 결과 해당 사진이 나왔다.

image

해당 이미지에 보이는 비석은 실사구시라는 고사성어가 적혀있다. 따라서 우리학교에 실사구시관이 마지막 flag파일의 비밀번호와 연관이 되어 있다고 생각하여 여러가지 시도를 했지만 아니였다.

수많은 시도 후 대회 시작전 보여준 ppt의 내용 중 flag파일의 비밀번호는 Victim시스템에 암호화된 문장으로 저장이 되어있다는것을 깨닫게 되어 find / -name *tlftkrntl(한국어 자판으로 실사구시)* 2>/dev/null의 결과로 tlftkrntl.txt라는 파일을 찾아냈다.

image

해당 파일도 /var/www/html에 옮겨 확인한 결과

1
2
3
4
5
ngbhCyeK41WQV7ETT7PhLO604NvhUsLAIeeo7DSrVNMlNW9a4ArOqpBe94OdzrWb

AES_ECB_128

where is your key?

AES로 암호화된것같이 보이는 암호문이 보였다.

혹시 key가 이 파일과 같은 위치에 있나 확인해보니 aes_secret_key라는 파일을 확인했다.

image

찾아낸 정보들을 이용해 AES Online Decryption을 통해 복호화를 한 결과 watching youtube after retirement라는 문구를 찾아냈다.

image

image

image

마치며…

마지막 flag파일의 암호문이 Victim 시스템에 있는지 모르고 그저 이미지만 보고 유추해 넣어본 과정들

image

끝나고 나서 좀 생각해보니 DVWA파일을 복제해서 만든 가상머신이라면 이 대회를 준비하는데 만들어진 필요한 파일들은 최신 파일일테니 find명령어를 이용해 최근에 만들어진 파일들을 먼저 확인했더라면 풀었던 방식보다는 2~3시간은 더 빨리 풀 수 있었다는 생각이 들어 많이 아쉬웠지만 그래도 2등으로 만족을 했다.

This post is licensed under CC BY 4.0 by the author.