작은 메모장

40. 취약점 진단 실습 3 본문

실더스 루키즈 교육

40. 취약점 진단 실습 3

으앙내눈 2024. 2. 28. 21:09

실습 시작에 앞서, 해당 명령어를 입력한다. NetworkMiner를 설치하기 위함이다.

사실 요즘에는 Wireshark가 상당히 유행이지만, 여기서만 제공하는 기능도 있어 이것만 사용하는 사람도 있다.

sudo apt update

sudo apt install mono-devel

wget https://www.netresec.com/?download=NetworkMiner -O /tmp/NetworkMiner.zip

sudo unzip /tmp/NetworkMiner.zip -d /opt/

cd /opt/NetworkMiner*

sudo chmod +x NetworkMiner.exe

sudo chmod -R go+w AssembledFiles/

sudo chmod -R go+w Captures/

 

제공하는 샘플 로그 파일도 받아준다.

 

 

설치한 NetworkMiner를 실행할때는 그냥 해당 경로로 들어가서 exe파일을 실행하면 된다.

 

분석 방법은 Wireshark와 동일하게 pcap파일을 열면 된다.

 


퀴즈 1

1. 공격자의 IP 주소는?

2. 공격자가 서비스에 접속하기 위해 사용한 계정 정보는?

3. 공격자가 공격하기 위해 사용한 대상 주소 URL은?

4. 공격자가 사용한 파일 이름은?

5. 공격자가 획득한 개인 정보는?

6. 공격자가 시스템에 침투 한 후에 실행한 명령어는?

 

1. 공격자의 IP 주소는?

패킷의 형태를 보면, 한쪽이 일방적으로 요청을 하고, 그 요청을 받는 형태로 되어 있다.

즉, 요청을 하는 쪽(206.152)가 바로 공격자인셈.

 

Wireshark로 Conversations를 확인해도, 206.152가 일방적으로 요청을 보내는 것을 확인할 수 있다.



2. 공격자가 서비스에 접속하기 위해 사용한 계정 정보는?

61번 패킷을 확인해보자.

 

이 TCP 스트림의 정보를 보면, 로그인 페이지 응답 정보를 담고 있는 것을 확인할 수 있다.

이 정보 안에 로그인 ID와 비밀번호를 담고 있는 것도 확인할 수 있다.

 

Wireshark에서 제공하는 패킷 분석으로도 이를 확인할 수 있다.


3. 공격자가 공격하기 위해 사용한 대상 주소 URL은?

공격자가 진행한 Requests 정보를 확인한다.

 

패킷 Burst 순서를 맞추고 다시 패킷을 확인하면, 요청 순서대로 Request가 정렬된다.

 

해당 순서를 확인해보면,unrestricted_file_upload.php에서 전혀 다른 경로인 php-backdoor.php라는 주소로 이동하였다.

그 후, php-backdoor.php라는 주소에서 뭔가 명령어를 잔뜩 입력하는 것을 확인 가능하다.

때문에, 공격자가 공격을 진행한 URL은 unrestricted_file_upload.php인 것.

 

 

4. 공격자가 사용한 파일 이름은?

상기 확인하였듯, php-backdoor.php라는 파일을 업로드 후 사용하였다.

Wireshark가 제공하는 파일 추출 서비스를 이용하여 이를 확인한다.

 

이 html를 열면, 웹 쉘 환경이 나오는 것을 확인할 수 있다.

 


5. 공격자가 획득한 개인 정보는?

Wireshark가 제공하는 파일 추출 서비스에서, 가장 마지막으로 요청한 명령의 정보를 덤프뜬다.

덤프 결과는 html로 저장한다.

 

이 html을 열면, 요청 결과가 나온다.

이 결과가 공격자가 획득한 개인정보인 것.

 


6. 공격자가 시스템에 침투 한 후에 실행한 명령어는?

아까 확인한 Requests 순서를 다시 보면, php-backdoor.php에 여러 명령어를 입력하는 것을 확인할 수 있다.

이 명령어가 위 질문의 해답이 될 것이다.

 


퀴즈 2

 

 


퀴즈 3

1. 악성코드 감염된 사람이 방문한 사이트 도메인은?

2. 악성코드가 삽입된 메뉴(기능)을 추정해보세요.

3. 악성코드 스크립트 구문은?

4. 악성 서버가 배포되는 IP 주소는?

5. 사용자에게 감염된 악성코드 파일 이름은? (확장자 포함)

6. 감염자에 연결된 악성서버 포트 번호는?

7. 공격자가 사용자 감염을 유도하기 위해 사용한 페이크 설치 화면은?

 

1. 악성코드 감염된 사람이 방문한 사이트 도메인은?

사용자가 접속한 Request을 분석해보자.

test.nanum.info:82를 접속하여 사용자는 이것저것 둘러보았다.

이 때, 게시물 사이트로 접속하는 순간 192.168.130.129:3000으로 hook.js가 동작하여 뭔가 엄청나게 많은 접속이 발생하였다.

그리고 마지막으로, security_install을 설치하여 실행한 것을 확인할 수 있다.

이를 통해, 사이트 도메인은 test.nanum.info:82로 유추할 수 있다.

 


2. 악성코드가 삽입된 메뉴(기능)을 추정해보세요.

Wireshark가 제공하는 파일 추출 서비스에서, 여러 파일을 덤프를 시도한다.

사용자가 감염이 된 부분으로 추정하는 게시판 시스템을 덤프를 뜬다.

 

실행하면 다음과 같은 html이 아직도 스크립트가 동작하는 것을 확인할 수 있다.

더 자세한 내용을 보기 위해, 소스 내용을 확인한다.

 

사용자가 감염된 파일은 hook.js라는 이름의 파일이었다.

이를 탐색한다.

 

이는 게시판의 저 빈 공간에 해당되는 것이다.

즉, 게시물의 글을 쓰는 공간에 이를 주입한 것.

 


3. 악성코드 스크립트 구문은?

2번에서 이야기했듯, 저 사이의 hook.js로 써놓은 부분이 스크립트 구문이 된다.

 


4. 악성 서버가 배포되는 IP 주소는?
1번에서 이야기하였듯, 192.168.130.129:3000이 악성 서버 배포 IP 주소가 된다.

 

 

5. 사용자에게 감염된 악성코드 파일 이름은? (확장자 포함)

1번에서 이야기하였듯, /security_install.exe가 악성코드 파일 이름이 된다.

 


6. 감염자에 연결된 악성서버 포트 번호는?

1번에서 이야기하였듯, 3000번 포트를 통해 악성 파일이 오고갔다.

 


7. 공격자가 사용자 감염을 유도하기 위해 사용한 페이크 설치 화면은?

Wireshark가 제공하는 파일 추출 서비스에서, 여러 파일을 덤프를 시도한다.

뜬금없이 flash_update 이미지 파일이 하나 들어가있는 것을 확인할 수 있다.

이를 덤프한다.

 

그럼 이렇게 이미지로 된 어도비 플래시 업데이트 창이 나오게 되는데, 이를 통해 감염을 유도했을 것이라 유추할 수 있다.

 


퀴즈 4

1. 공격에 성공한 공격자 IP는?

2. 공격자 이외 서비스에 접근한 IP는?

3. 공격자가 시스템에 침투하기 위해 접근한 서비스 포트는?

4. 공격자가 어떤 취약점을 이용한 것인지 서술하시오.

5. 공격자가 리버스공격을 하기 위해 사용한 포트는?

6. 공격자가 올린 웹쉘의 이름과 md5 해시 값은?

7. 공격자가 웹쉘을 올린 뒤에 사용한 명령어를 찾는대로 작성하시오.

 

1. 공격에 성공한 공격자 IP는?

TCP Conversation을 보면, 여러 대화 목록을 볼 수 있는데, 통상적으로 사용하지 않는 포트를 사용한 것을 볼 수 있다.

 

206.152가 열심히 특정 포트에 대해서 뭔가를 시도한 결과, 서버인 206.133이 206.152에 대해 반대로 연결된 것을 확인할 수 있다.

즉, 리버스 커넥션에 성공하여 연결이 반대로 성립된 것을 유추할 수 있다.

따라서, 공격에 성공한 공격자 IP는 206.152로 볼 수 있다.

 

 

2. 공격자 이외 서비스에 접근한 IP는?

Conversation에는 206.152 말고 206.154 또한 서버와 통신을 하는 것을 확인할 수 있다.

 


3. 공격자가 시스템에 침투하기 위해 접근한 서비스 포트는?

1번에서 보았듯, 8180 포트로 접근하였다.

 

 


4. 공격자가 어떤 취약점을 이용한 것인지 서술하시오.

해당 패킷의 요청 목록을 확인하면, 공격자가 웹 쉘을 올리기 위해 /manager/html/upload로 접근한 것을 확인할 수 있다.

해당 서비스는 아파치 톰캣의 구조로, 따라서 톰캣 취약점을 이용하여 공격을 시도한 것을 유추할 수 있다.

 

 

5. 공격자가 리버스 공격을 하기 위해 사용한 포트는?

1번에서 확인하였듯, 8989 포트를 사용하여 공격을 진행하였다.

 


6. 공격자가 올린 웹쉘의 이름과 md5 해시 값은?

4번에서, 공격자는 서버의 관리 페이지를 통해 업로드를 진행하는 것을 확인하였다.

이를 추적하면, 1509 스트림의 패킷이 attack.war를 업로드하는 것을 확인할 수 있다.

따라서, 그 패킷의 데이터가 쉘 코드가 된다.

 

데이터를 추출하기 위해, 해당 패킷의 데이터를 추출한다.

이름은 원본 그대로인 attack.war로 저장한다.

 

이를 MD5 해시화 하면, 해당 파일의 해시값을 획득할 수 있다.

 


자바 스크립트 난독화 문제

미리 말하지만, 해당 바이러스는 랜섬웨어를 담고 있기 때문에, 각별한 주의를 주지 않는다면 컴퓨터에 문제가 생길 가능성이 높다는 것을 이야기한다.

 

해당 문제는 이메일 형태로 감염이 되는 바이러스로, 이메일을 분석하여 내부의 쉘 코드를 탐색 및 해석하는 문제다.

 

메일이 여러가지가 있는데, 이 메일들은 전부 첨부파일을 담고 있는 메일의 형태다.

대부분의 메일은 일반적인 첨부 파일을 담고 있으나, 1352 번호를 달고 있는 메일이 바로 문제의 메일이다.

해당 파일을 저장한다.

 

해당 파일의 압축 안에는 js 파일이 존재하는데, 실행파일이 아닌 js 파일을 전송한 이유는 높아진 바이러스 탐지 때문이다.

근래 사용하고 있는 모든 메일 메신저들은 대부분 .exe 파일 탐지 등을 기본으로 탑재하기 때문.

이 자바 스크립트 파일은 실행되는 순간 특정 서버로 연결되어 특정 프로그램을 받아올 것이며, 생각없이 이를 실행하면 영락없이 감염이 된다.

이를 분석해본다. 환경은 노트패드++ 이다.

 

악성 코드가 단 한개의 줄로 이루어져 있다. 굉장히 보기 힘들게 작성되어 있는 편.

이처럼 코드를 고의로 읽기 어렵게 만들어 분석에 시간을 소모하게 만드는 것을 난독화라고 한다.

이 코드는 지금 줄바꿈 없는 난독화가 되어 있으므로, 일단 자동 줄바꿈으로 한눈에 들어오게 만든다.

 

자바 스크립트의 경우, 세미클론(;)으로 그 다음 명령을 구분한다.

현재 이 코드는 세미클론에 줄바꿈 없이 일렬로 작성되어 있으므로, 이를 수정할 것이다.

바꾸기 기능을 이용해 세미클론의 특정 패턴을 찾아 이를 전부 줄바꿈을 넣을 것이다.

 

현재 모든 명령은 k77이라는 함수 안에 들어가서 작동하고 있다.

이 함수가 어떤 기능으로 동작하는지는 모르겠지만, 일단 한 줄의 형태는 무조건 k77();의 꼴을 나타낼 것이다.

때문에, 세미클론과 k77사이에 줄바꿈 문자를 넣는 식으로 변환한다.

 

이제 코드가 눈에 편하게 되었다. 이 코드를 분석해보자.

코드의 핵심은 크게 3가지로,

코드 맨 첫째줄의 함수 및 배열 선언,

코드 중간의 수많은 함수 입력,

코드 마지막 줄의 배열 실행 명령으로 나뉜다.

 

코드의 흐름은 대략적으로 다음과 같다.

- t42라는 배열을 하나 새로 만든다.

- k77은 두가지 변수를 받는데, 하나는 t42배열의 주소와, 나머지 하나는 t42배열에 들어갈 값을 입력받는다.

- 그 후, k77 함수로 여러 문자열을 정해진 위치에 입력받는다.

- 입력이 끝나면, 배열을 전부 합쳐 하나의 완성된 배열로 만들고, 이를 실행한다.

즉, 특정 코드를 무작위로 섞어놓고 이를 다시 배열 안에 재조합 후 실행하는 코드인 것이다.

 

이 코드를 수동으로 배열에 집어넣는 것은 정말 힘든 과정을 거칠 것이다.

때문에 코드를 실행하는 부분을 제외하고 프로그램을 돌릴 것이다.

프로그램 실행은 크롬 개발자 도구에서 실행한다.

 

해당 내용을 다시 노트패드로 가져온다.

 

해당 내용이 자바 스크립트라는 것은 알았으니, 형식에 맞게 가독성을 높일 것이다.

해당 코드는 세미콜론 후에 빈 공간이 존재하고 있다.

이 빈 공간을 줄바꿈으로 바꾸면 정렬이 될 듯 하다.

 

훨씬 깔끔하지만 아직 한 눈에 들어오는 가독성은 부족하다.

이에 자동으로 들여쓰기를 하는 플러그인을 설치하여 가독성을 높인다.

 

코드가 정말 깔끔해졌다.

이제 이 코드를 분석해보자.

 

 

코드는 크게 2파트로 나뉜다. 변수 선언 파트와 코드 동작 파트로 나뉜다.

 

변수 선언 파트에서 유의미한 정보를 보면, ll이라는 이름의 변수가 유의미한 정보를 담고 있는 듯 하다.

ll 변수에는 이상한 이름의 여러 도메인 주소가 적혀 있는데, 이는 악성코드 감염을 위한 중개 서버의 도메인을 적어둔 것이다.

ws 변수에는 WScript.shell이란 프로그램을 연결하는데, 이는 컴퓨터의 cmd shell과 동일한 역할을 한다.

fn과 pd 변수에는 각각 /temp/ 폴더 밑에 들어갈 폴더 이름을 설정한다. 즉, 임시 폴더 밑에 저장고를 만드는 것.

 

코드 분석 파트는 정말 다양한 내용이 있지만, 중요한 내용은 길지 않다.

이 파트의 대략적인 흐름은 다음과 같다.

- 이 코드는 n과 i로 반복하는 for문에 의해 제어된다. 즉, n, i를 사용하는 이중 for문이다.

- ll 변수에 있는 도메인 주소를 꺼내서 id 변수값과 함께 중개 서버로 GET 요청을 전송한다.

- 만약 GET 요청이 성공한다면, 요청으로 얻은 파일을 n값을 기준으로 정해진 확장자와 경로로 저장한다.

- 에러가 발생한다면, 무시하고 계속 실행한다.

 

코드의 나머지 파트는 많이 보던 문구가 적혀있다.

바로 랜섬웨어에 감염되었으니 비트코인을 전송하라는 문구.

이 문구 생성에는 조건이 있는데, 감염으로 생성된 exe파일 혹은 php 파일이 존재한다면 이 문구를 생성한다.

 

문구 생성이 끝나면, 컴퓨터의 레지스트리 정보를 바꾼다.

노리는 것은 HKEY_CLASSES_ROOT와 HKEY_CURRENT_USER다.

CLASSES ROOT는 컴퓨터에 존재하는 확장자 정보가 들어가 있다.

이 정보를 전부 .crypted 확장자나 비슷한 유형의 확장자로 전부 변환시킨다.

 

CURRENT USER는 현재 사용자의 환경 변수 정보가 들어가 있다. 가령, 바탕화면 설정 상태나, 프로그램 권한 관리, 시작프로그램 설정 등 굉장히 중요한 내용들이 들어가있다.

해당 경로를 직접 찾아가보면, 이 경로는 시작 프로그램 정보를 모아놓은 공간임을 확인할 수 있다.

여기에 위에 설명한 비트코인 협박문을 적어서 등록시키면, 껐다 켤때마다 협박문이 뜨게 되는 것이다.

 

시작 프로그램 등록이 끝나면 지정된 위치에 저장해놓은 php 파일을 실행하여 암호화를 진행한다.

그 후, 사용한 임시파일을 지우고 코드가 종료된다.

 

 

여기까지 했음에도 아직 탐구해볼만한 곳이 있는데, 상단의 이상한 도메인으로부터 받아오는 프로그램의 내용을 우리는 모른다.

때문에, 해당 프로그램이 동작할 때 발생한 트래픽을 분석할 것이다.

 

Requests를 분석하면, 해당 이상한 도메인으로부터 뭔가 파일을 받고 있는 모습을 볼 수 있다.

이를 객체 추출로 파일을 뽑아보면, 이미지 5개를 받고 있는 것을 확인할 수 있다.

그러나 Networkminer로 이걸 검사하면, 이 이미지는 이름이 .png로 된 파일이지, 실제로는 exe, dll 및 php 파일임을 확인할 수 있다.

즉, 확장자까지 속여 검출이 굉장히 어렵게 하려는 모습을 볼 수 있다.

'실더스 루키즈 교육' 카테고리의 다른 글

42. 모의해킹 총정리  (0) 2024.03.22
41. 소스코드 취약점 진단  (0) 2024.03.06
39. 취약점 진단 실습 2  (0) 2024.02.27
38. 취약점 진단 실습 1  (0) 2024.02.26
37. 도커 파일과 도커 컴포즈  (0) 2024.02.23