Remote control software project – Github & coding! – Caius Juvonen

Welcome back to another progress post on my project. This time we’re going to

  • Get the github working
  • Start the project code.

How far we’ll go in the second step we’ll see, but the idea would be to get some actual code on to github. However, we first have to establish the github repo.

Creating a github repo

We’ll start by going to github and then heading over to the “My repositories” page. There you have an option to click New. The following screen will be displayed:

I’ve already filled in the details. You can see the repository name, description of the project, and a couple other options (README, the license, etc). This project will also be a public one, after some consideration. Next we’ll just click “Create repository” to finish creating it.

Next we’ll have to install Git on our machine if we haven’t done so yet. Mine already has it, so there is no need to repeat the process, but you could easily do it with

sudo apt-get update
sudo apt-get install -y git

After this we’ll need to do a couple configuration settings on our machine, let’s insert the following commands:

git config --global user.mail "youremail@example.com"
git config --global user.name "Your name"
git config --global credential.helper "cache --timeout=3600"

The first command is where you’ll put your email address (of your github account). On the second command you’ll give your name, and the third command is there to save your password for one hour (1 hour = 3600 seconds). You can obviously have this for longer if necessary, for security reasons I wouldn’t recommend it though. You can review these config settings by typing

git config --list

Next we’ll clone the repository on to our local machine. Go to your github repository we created in an earlier step, and click on Code:

The link you see is what you’ll use for cloning. Copy paste that, and go on your machine where you’ll type:

git clone "https://github.com/youraccount/yourgit.git

Just to be clear, the github.com address is the one you copied in the previous step, just so no-one is confused that the above command doesn’t magically clone their git repositories. Also, be sure to do this where you want your project files to end up in! I personally cloned this to Pycharmprojects.

This is the end result of that:

As you can see, a new folder has magically appeared (this is from the git repo we cloned). Let’s look inside:

As you can see, we’ve received the README.md and the license. Let’s see if these area real or just dummy files with nothing in them:

Seems right. The README.md only contains the description we gave while creating the repo, we can write our own stuff here later on! However, we’re still missing something: the actual code! Let us head to pycharm and get the project started for real.

So to use pycharm, first of all you need to know where you’ve installed it. If you’ve followed my instructions from previous blog posts, you would know that it’s installed in /opt/ . So to start pycharm, head to /opt/pycharm-blah-blah-blah/bin and type

sh pycharm.sh

And just to be clear, it’s not pycharm-blah-blah-blah, but it’ll be something along those lines. Check the folder name by typing ls inside the /opt. Anyways, this starts pycharm, and we should be greeted by a window where you can select to create a New project. This is the New Project screen:

Take a good look at the location, since I’ve changed it from the default. As you can see, we’re creating this project inside the cloned git repository, so that we’ll be able to get the updates to git. Just click Create, and this should create a new folder inside our git repository (we’ll do the commit in a little bit).

Let’s pycharm a moment to load the virtual environment. After it’s done, you should see something like this:

Seems like a bunch of nonsense. Let’s remove it all and instead add our own code there! For the sake of demonstration, we’ll do a simple “Hello world” to start off with.

This is now officially the first line of code in our project. Let’s save what we’ve created and take a look at the folders again.

A new folder has been created, what’s inside?

There’s our code. I think we’re satisfied with the changes for now, time to add them to git! When you’re ready to commit the changes you’ve made to a project to git, you simply do the following command:

git add . && git commit; git pull && git push

This acts as a commit while also making sure you’ve got the latest changes in your project. This will prompt you to give a commit message. In my case this was vi, which can be tricky to operate if you’ve never used it before. Press i to enter insert mode, and then just type the commit message there, esc to escape. To get rid of this commit message “screen”, type :wq (outside of insert mode). It should now ask for your credentials to your github account. This is where you’ll type your username and password.

After you’re done, it should add the commits you’ve made to the github page. Let’s check ours:

As you can see, the code & folder have been uploaded to git successfully. Now that we’ve established how to use git and gotten the repo to work, it’s time to start coding!

Start of the project code

First we need to envision what the program will be like before we can start actually coding it. I’m referring to the control channel, which I’ve illustrated here:

As in, we need to decide how these devices communicate (the attacker needs to be able to give commands to the target, and we’re referring to the method of doing that). Now, in my mind, there are two options:

  1. The target connects to the attacker through sockets
  2. We use a HTTP server

And for this project, I leaned more towards the first option, since I’ve worked with sockets before and I’m more comfortable doing it that way. The second method is just fine as well though, and it would probably be a better idea.

Next, we’ll have to realize that we’ll need to make two programs: one that is used by the attacker to control the victim machine, and then one to give to the victim which enables us to do this. Due to firewalls and antivirus programs, the victim will connect to the attacker. Doing it the other way is unlikely to work.

We should start by testing this connection first and foremost. If we cannot establish a connection between the computers, this will obviously not work. So we’ll start with that.

To use sockets, we simply import the sockets library, and then we’re ready to start coding. Our purpose here is to make a program that can connect from one computer to another, nothing else! Remember that this is merely the starting test phase. Two lines of code is enough:

This is our entire program, and we won’t need anything else (for now). When ran, this’ll try to establish a connection to that port on that IP (meaning we have to be listening on the attacker machine). We don’t have a server made yet, that’ll be for later, so we’ll use the command line here. However, we need to get this file to the target computer to test if this is going to be working at all.

To make distributing files from the Kali machine to the Windows machine easier, I’m setting up an apache2 webserver where the target can download the necessary files for our testing. The great thing about this is that you don’t need an internet connection to do this.

Now we’ll just copy the program we just made to the malwarefiles directory, after which it should be accessible at 10.0.2.7/malwarefiles .

Those are all the commands we need. Let’s check the folder at /var/www/html/malwarefiles:

Looks like it’s there. Now we just start the apache2 webserver:

Let’s go to the victim machine for a second and see if it can reach the webpage and the file.

Looks like there isn’t a problem. However, our windows machine cannot run that python file, it needs to have python installed first. So we’ll do that now. We’ll head over to python.org and find the latest python 3 windows installation.

I picked the last option, since it’s the easiest. After downloading the file, simply let the installer do its job. After that, you should be able to run python files on the windows machine in cmd by typing

py file_name.py

However, for me, this was not the case. I instead got greeted with this message:

It’s telling us to either use Microsoft Store or then to disable this shortcut from Manage App Execution Aliases settings. Well, let’s do that. On Windows, go to search and type Manage App Execution Aliases, like so:

Let’s click the top option. As you can see, we have two python.exe’s here:

These need to be turned off. After doing that, try again.

Woops, I typed SCOCK_STREAM and not SOCK_STREAM when coding. Let’s quickly fix that in the code and download the new file (while also removing the old file from the apache file server).

Above is a gallery of the steps required. Be sure to refresh the apache web server on the Windows machine before downloading anything. Now we should be able to run the “malware” file on the windows machine. But before we do that, remember that the Kali machine has to be listening on the port to receive the connection! You can use the following command:

nc -vv -l -p (port)   | example nc -vv -l -p 6666

Be sure not to include the pipe, it’s there just to separate the example. By the way, the port can be something different but be sure to use something that is available and also make that change in the code. After the kali machine is listening on the port, we’ll run the program on the windows machine:

The connection was successful! This means that the two devices reached each other, though no data was sent. Anyways, at this point I’m committing this to git since we’ve created a whole new file. I also edited the README.md file a little by using vi.

Before we’re done for this time, I want to add a couple improvements to the code. Currently we don’t have a real TCP session between the computers, we just connect and then the connection is terminated. However, this would obviously not be the case with our real environment.

I’m now going to make it so that we can actually send data over the connection, and a couple other tweaks that I thought would be good form.

As you can see, we’re now sending a message whenever we successfully connect (this is great since the connection won’t automatically close anymore). After that I’ve made it so that you can send data over this connection (1024 is the buffer size). Remember that this is the program that runs on the Windows machine.

We can now test this code. Repeat the steps above in this post to remove the old file and to try out the new one instead.

While the windows machine actually complained about an error, it still worked. We got a message on the Kali machine when the connection was established, after which we sent some test data to the target and it was received well. Though, we could probably use some newlines…

I added the newlines and performed a new test.

I would say we were more successful this time, as we also didn’t receive an error on the windows machine. It’s a little annoying that the b and \n come with the text, but for now that is fine (who am I kidding, it’s not fine and I fixed it with a slight change in code):

The problem was that the data that I was printing wasn’t decoded before because I forgot that it doesn’t work like that. This is fixed in the above picture. Below are the results of these final changes.

For now, I believe I’m quite satisfied with the code. Next we would code the server side of things as well, but I believe we’ve made enough progress to save these changes to GitHub and continue coding in the next blog post.

Caius Juvonen

Remote control software project – Setting up the environment – Caius Juvonen

In this blog post of the Remote control software project I’ll be setting up the environment for our project, which will be done with VirtualBox. Our devices will be Kali Linux for the attacker machine and Windows 10 for the victim machine.

Pycharm installation

Let’s start with the attacker side of things. Luckily I already have a Kali Linux installed on my VirtualBox, and I’d rather avoid the process of doing it again, so we’ll roll with that. However, I did not have a Python IDE ready (PyCharm is what I prefer) so I went out and installed it. Here is how I did that:

First of all, download the community version here: https://www.jetbrains.com/pycharm/download/#section=linux

After you’ve downloaded the file to your machine, go to your Downloads folder (or wherever you downloaded the file to) and then unpack it with the following command:

sudo tar xzf pycharm-*.tar.gz -C /opt/ 

You can use a different file destination, I prefer the /opt/ in this case. By the way, make sure to run this command from the Download directory. Now, just head over to the installation folder, should be /opt/pycharm-*/bin in this case, and then run pycharm:

sh pycharm.sh

PyCharm should launch properly now, and you’re ready to start coding!

Windows 10 machine

Next we’ll obviously need the victim machine ready to go. Notice that while testing the software we will be conducting the first experiments offline, but this can be done once we reach that stage.

Let’s start by getting the Windows 10 iso-file. We’ll go to https://www.microsoft.com/en-us/software-download/windows10 and click the “Download tool now”:

After we’ve downloaded the file, we run it. Just accept the licenses/etc:

On the next screen be sure to select the correct option, “Create installation media”, then go next:

Just go next here.

Be sure to select ISO-file here, and go next:

You can save the file where you want to, I personally just made a new folder for it. After that just Finish to exit the program.

Creating a new virtualbox instance

Click on New.

Just name your virtual instance (if you give it a name such as Windows 10 it automatically detects the type and version). Press Next.

Next you’ll want to decide the amount of RAM for your virtual machine. I’m going overboard here, you don’t need 4GB. Next.

Default settings are fine here, just click Create.

Again, go with defaults and click Next.

Dynamically allocated disk saves some space from your host computer, since it won’t use resources that it doesn’t need. Next.

Now you’ll decide the installation path, choose the disk and folder path you like the most. 50GB is more than enough for our purposes. Click “Create”.

Now you’ll have the instance created, but we’re not done yet. Select the newly created Instance, and click “Start”.

Now is the time to select your .iso file. In the case your .iso file is not automatically selected, click the highlighted icon:

If your .iso file is not on the list, click “Add”.

Now browse to the location of your .iso file in the previous step, and then select it. Click “Open”:

Now just choose the Windows iso-file.

Now we’re ready to start the actual installation. Just click “Start” once you’ve confirmed you’ve selected the correct iso-file:

Once you get this screen, select the preferred installation language and keyboard layout. I prefer the text to be in Finnish, but having a US keyboard layout is very confusing, which is why I recommend the Finnish layout for anyone from Finland. Click Next once you’re happy with the choices.

Now it’ll ask you to activate Windows. Unless you’ve prepared a product key, go with “I don’t have a product key” at the bottom.

Now you’ll be selecting the operating system. I personally don’t really care, and this shouldn’t really matter anyway (who even knows what the differences are, jeez). We’ll just go with Windows 10 Home, which is the “basic”.

Accept the licenses/etc and click Next.

You’ll need to choose the CUSTOM option here. We can’t upgrade the OS as we are doing a fresh install.

After you’ve clicked on Custom, just continue with the default and the installation process will begin. Once the installation is done, it’ll ask for your region, I said Finland. For the keyboard layout, go with your own layout.

It’ll ask you if you want a second keyboard layout. Personally I don’t need this, so I’m just going with Skip. Slightly annoyingly, it’s asking for us to add an account. I just created a new one with a throwaway email address that I had. Not a big deal. Create the account or use an existing account.

I’m not sure what it’ll ask next if you use an existing account, but I had to give my country/birth date and also create a PIN for the account. After you’re done with that it’s going to ask if you want a bunch of features, just say No. Windows is quite annoying with stuff like this, probably why I should’ve picked something other than Windows 10 Home. Anyways, I just declined all the features and skipped through to the end of the installation. Here is the end result:

In the last part, we’ll make sure that the two computers (Our Kali Linux attacker and Windows 10 target) are in the same network.

Network configuration in VirtualBox

What I personally like to do is make a Nat Network and use that to make sure that the devices are in the same network. Remember that later on we’ll have to disconnect the devices from the internet for our malware tests, but that is not necessary just yet.

Let’s start by creating a new Nat Network to document the whole process. On VirtualBox, go to File -> Preferences:

Select Network and click the small green icon on the right-side of the screen:

It should create a new NatNetwork, and it’ll be named NatNetwork2 in our case since I’ve already made two NatNetworks before this. However, we can rename this by clicking the orange icon on the right-hand side:

I’ve decided to name mine Malware Test, though you’re free to name your Nat network what you wish. After this just click OK twice, and we’ll have that new Nat Network. Now we only have to include these devices in the network. Let’s start with our Kali attacker machine. Click your Kali instance and then Settings.

Select Network and then Nat Network and make sure you have the right NAT network selected (in my case it’s Malware Test as we just established).

Now repeat the process for the Windows 10 machine. Let’s start both of these instances and test our connection!

As we can see, the devices seem to be in the same network. However, we can test this properly by having the devices ping each other.

Surprisingly, we failed! While the Windows machine was able to ping the Kali machine, the opposite was not true. I tried a couple of things to get the problem down. First, I tried pinging the default gateway on the Kali machine:

This worked just fine. I also thought that insufficient permissions might have something to do with it, which is why I also tried to sudo ping:

That didn’t work either. Okay, what about the Windows 10 machine? Though I’m not sure how it could happen, maybe it’s pinging a machine that is not actually the Kali machine, so I tried a couple random IP-addresses:

The first couple IP-addresses returned nothing, as expected. However, the 10.0.2.2 and 10.0.2.3 addresses returned my pings, which didn’t seem to make much sense! However, upon further inspection, these addresses seem to be related to how VirtualBox does its networking, as my Kali machine was able to ping these addresses:

So as the situation stands, our Kali (the attacker) is not able to ping our victim (Windows) but the victim is able to ping the attacker! Normally this shouldn’t be possible since a ping is supposed to be a two-way street, which is why I still suspect the problem lies with the Windows machine: its not responding to the pings. This makes me think it’s a firewall issue.

I head over to the Windows Firewall settings by typing “Windows firewall” in the search bar. Click on “Firewall & Network protection”:

Next we’ll need to go to the advanced settings:

In the advanced settings, click on Inbound rules. We’re looking for a rule with the name “File and Printer Sharing (Echo Request – ICMPv4-In)”. Here we go:

As you can see, this option is disabled, confirming my suspicions. Let’s enable both rules (there’s one for domain and one for Private and Public):

Next we’ll try pinging again.

As you can see, the ping is now successful! While it might not be crucial for our devices to be able to ping each other, we still want to confirm that the devices are indeed in the same network, since otherwise the whole project would be a little bit more challenging to complete. Plus, I liked solving the problem with the pings, so there you go.

We’ve now successfully set up the environment and we’re ready to move on to the next stage. Catch you on the next episode!

Caius Juvonen

Remote control software project – Start! – Caius Juvonen

Hello, and welcome to a new blog series where I’ll cover a new school project that I’ve started working on. This series will be in English, unlike the previous ones.

So as I said, this project is a part of a school course. The goal of the project is to create a remote control software with Python, that targets Windows 10 computers. The software would be able to take screenshots, record keystrokes and upload/download files to the target computer. Other features might be added along the way, but those were the initial ones that I felt were the most important.

Another goal of the project is to get past antivirus software. As you might have noticed, this project is just as much about the software as it is about the cybersecurity. The true goal of this project is to simulate cybersecurity attacks, knowing how such software work and what different methods there are to bypass antivirus software detection.

This project already has a project plan, here it is in PDF-format:

Please note that as the course is in Finnish, the plan is also in Finnish. I don’t think I’m going to be translating it either. However, most material regarding this project will be in English.

Here is my github page where I will be publishing the code as it progresses, as well as other material: https://github.com/caius-git?tab=repositories

It’s my own github page, you can find some other stuff there as well (well, a twitch bot project and also some old schoolwork, nothing special). The plan is to submit code as often as possible as the project progresses. So keep an eye out for this blog and the github page!

Caius Juvonen

Palvelinten hallinta läksyt viikko 7 – Caius Juvonen

Tällä viikolla teemme kyseisen kurssin viimeiset läksyt, ja samalla rakennamme oman moduulimme. Kurssisivu ja läksyt löytyvät täältä: http://terokarvinen.com/2020/configuration-managment-systems-palvelinten-hallinta-ict4tn022-spring-2020/

b) Oma moduli (iso tehtävä). Ratkaise jokin oikean elämän tai keksitty tarve omilla tiloilla/moduleilla. Voit käyttää Salttia tai muuta valitsemaasi modernia keskitetyn hallinnan ohjelmaa. Esitä tulos viimeisellä opetuskerralla, 5-10 min (keskiviikon ryhmä). Live demo olisi kiva. Raportoi modulisi tarkoitus, koodi ja testit.

Ympäristö

Meidän ympäristössä on yksi mestari ja 2 orjaa, jotka molemmat toimivat etäisesti. Kaikki koneet ovat samassa verkossa, ja niillä on yhteys internettiin. Yksi orjakoneista on RedHat ja toinen on Ubuntu. Mestarikone toimii Ubuntulla. Kyseessä on siis 2 xubuntu konetta ja 1 CentOS.

Tavoite

Ennen kuin aloin tekemään tätä projektia yksi kysymys oli mielessäni: mitä oikeen teen? En halunnut tehdä jotain sellaista mitä olen jo aiemmin tehnyt, ja fiksuja tapoja käyttää näinkin hienoa systeemiä on vaikea keksiä mikäli niitä tarpeita ei ole tullut vastaan etukäteen.

Pitkän mietinnän jälkeen ajattelin että liian pitkä mietintä johtaa ainoastaan ajan hukkaamiseen, ja päätin tehdä jotain simppeliä alkuun: asentaa shakkiohjelman orjille ja muokata joitakin asetuksia ohjelman kanssa. Ei kauhean kunnianhimoinen tavoite, mutta aika alkoi loppumaan kesken ja oli pakko valita vain joku projekti. Jos keksin matkan aikana jotain lisättävää, teen senkin. Mutta jos en, yritän vain raportoida sen hyvin jotta saan sentään jotain hyödyllistä tehtyä.

Etenemisprosessi

Jos haluamme asentaa jonkin ohjelman orjille saltilla, on meidän ensin asennettava se yksittäiselle laitteelle. Salt ei ole mikään ohjelmien asennusohjelma, vaan se monistaa sen mitä voimme tehdä yksittäiselle koneelle. Mutta mikäli se mitä teemme yksittäiselle koneelle ei toimi, ei se tule toimimaan vaikka tekisimme saman sadalle muullekin. Tämän takia on tärkeää ensin asentaa ohjelma yhdelle koneelle ja vasta tämän jälkeen monistaa.

Tulemme siis ensin asentamaan tämän shakkiohjelman mestarikoneelle, ja teemme samalla tarvittavat asetukset. Kun teemme tätä joudumme myös varmistamaan mitä asetuksia muokkaamme, ja miten, koska emme voi tehdä asetuksia saltilla pelkän ohjelman GUI:n avulla. Tämän takia meidän tarvitsee tietää mitä muutoksia ohjelman tiedostoissa tapahtuu.

Kun olemme saaneet ohjelman toimimaan yhdellä koneella, on aika monistaa asennus ja asetukset minioneille, ja sen jälkeen varmistaa että kaikki toimii tahdotusti. Tälläisissä tapauksissa kannattaa edetä mahdollisimman hitaasti yksi askel kerrallaan.

Ohjelmisto

Halusin asentaa shakkiohjelmiston nimeltä PyChess. PyChessin dokumentaatio löytyy täältä: https://pychess.readthedocs.io/en/latest/ (Lähde 1).Pychessissä on mukava GUI ja sen voi asentaa apt-get, eli ei tarvitse githubista esimerkiksi vetää. Tämä tekee asennuksesta helppoa, ja voimmekin keskittyä silloin mielenkiintoisempiin asioihin, kuten vaikka asetusten säätämiseen.

Moduulin tekeminen

Tässä kohtaa alamme työstämään itse moduulia. Kuten aiemmin mainitsin, aloitamme siitä että asennamme pychessin mestarikoneelle, ja katsomme miten ohjelma toimii/mitä voimme sille tehdä. Voimme asentaa pychessin komennoilla:

sudo apt-get update
sudo apt-get install pychess -y

Asennuksen jälkeen kun kirjoitamme terminaaliin “pychess” avautuu ohjelman GUI:

En tiennytkään että voimme myös pelata muita pelaajia vastaan emmekä pelkkää tietokonetta. Tuo on mahdollinen asia mitä tulemme vielä säätämään myöhemmin tätä tehtävää, mutta aloitetaan nyt tuolla “Start game” tietokonetta vastaan ensin.

Ensimmäinen mielenkiintoinen asia joka tarttui silmään softasta: tietokone suosittelee mitä siirtoja teemme, tai jotenkin ainakin analysoi siirtoja. En kuitenkaan haluaisi että se tekisi näin, vaan haluaisin pelata vain tietokonetta vastaan ilman että se näyttää meille mitä kannattaisi tehdä.

Kuten kuvasta näkyy, tietokone näyttää siirtoja. Tämä on häiritsevää mikäli haluaa vain pelata pelin shakkia eikä välttämättä lähteä mihinkään hirveään analyysiin parhaasta mahdollisesta siirrosta. Yritetään saada tätä asetusta pois päältä.

Kohdassa “View” on kaksi asetusta:

Hint mode ja spy mode. Nuo kaksi asetusta näyttävät sekä mitä meidän itse kannattaisi tehdä, sekä mitä tietokone on tekemässä. Nuohan pilaavat pelin heti alkuunsa kun tietokone lähtee kertomaan meille mitkä on parhaat mahdolliset siirrot. Samalla saamme tietää mitä tietokone ajattelee, joka myös antaa tietysti epäreilun edun vastustajaa vastaan (vaikka tietysti tietokonetta on vaikea voittaa vaikka tietäisi mitä se on tekemässä).

Tuo view ei kuitenkaan disabloi noita asetuksia lopullisesti, vaan pelkästään yhden pelin ajaksi. Menen “Preferences” ja löydän sieltä tälläisen sivun:

Tuossa siis nuo “Use analyzer” ja “User inverted analyzer” näyttävät tekevän saman kuin Hint ja spy mode. Otetaan pois päältä ja laitetaan uusi peli käyntiin ja katsotaan muuttuko mikään:

Emme enään nää nuolia siitä mitä meidän kannattaisi tehdä/mitä vastustaja on tekemässä, eli saimme nuolet pois pysyvästi. Seuraavaksi on tärkeä katsoa miten voimme tehdä tämän saman muutoksen tiedostoissa, sillä salt ei pysty tekemään näitä asetuksia GUI:ssa meidän puolesta.

Käytetään komentoa “find -printf “%T+ %p\n” | sort” jotta voimme nähdä viimeisimmät muutokset järjestelmässä (tämän avulla meidän pitäisi löytää pychessin config file).

Tuo ./.config/pychess/config vaikuttaa lupaavalta alulta. Eli asetukset ovat käyttäjän kotihakemistossa. Katsotaan minkälaisia asetuksia siellä on:

Aika paljon erilaisia, ja varsinkin nuo “Hint_mode” ja “spy_mode” = False vaikuttavat olevan ne oleelliset tiedot. Seuraavaksi meidän tarvitsee vain varmistaa että kaikilla orjilla jotka lataavat pychessin tulee olemaan nuo samat asetukset. Mutta hetkinen! Emme välttämättä halua että kopioimme nämä kaikki asetukset muille käyttäjille, sillä esimerkiksi pelaajan nimi on “caius”. Jos annamme näitä asetuksia muille käyttäjille, olisi järkevämpää että he saisivat omat nimensä myös alkuun. Eli haluamme vain nämä kaksi asetusta.

Voimme tehdä tämän käyttämällä saltin ominaisuutta file.replace. Löysin dokumentaation siihen täältä: https://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html (Lähde 2).

Eli tarvitsemme patternin ja sitten millä korvaamme sen. Käytämme tuossa patternin etsimisen kanssa Regexiä. Käytin RegExr patternin löytämisen kokeiluun: https://regexr.com/ (Lähde 3). Tässä regex jota käytin:

Tuo näyttäisi toimivan ihan OK. Tässä kohtaa haluan vaan kopioida tämän config tiedoston /srv/salt jotta voimme käyttää sitä siellä. Samalla on hyvä tehdä kansio tälle moduulille.

Ja tässä kohtaa myös ymmärsin että file.replace ei tule toimimaan. Config file on nimittäin jokaisen henkilön omassa kotihakemistossa, enkä voi mennä muuttamaan asetuksia ihmisten kotihakemistoissa. Olen aika varma että pychessillä ei ole global configuraatiota missään, joten asetuksia voi muuttaa ainoastaan käyttäjäkohtaisesti. Tulemme siis vain kopioimaan tämän esimerkki config tiedoston minioneille /etc/skel kansioon jotta uudet käyttäjät saavat sen.

Tässä tilapäinen init.sls tiedostoni:

Aion kokeilla tätä ensin yhdellä orjalla ennenkuin kokeilen useammalla. Jos saan tämän moduulin toimimaan kunnolla, tulen varmaan lisäämään jotain muutakin tähän.

Lisäsin tämän tilan nyt myös top.sls, mutta vain yhdelle orjalle. Pistetään “sudo salt ‘*’ state.apply” ja katsotaan mitä tapahtuu:

Kaikki onnistui. Mennään orjakoneelle ja käynnistetään pychess ja jännitetään että miten asetukset on laitettu:

Toimii tahdotusti. Nyt pistän tämän myös CentOS orjalle (kaiken pitäisi toimia samalla tavalla).

Ikävä kyllä olin väärässä, se ei toimi samalla tavalla. En pysty lataamaan pychessiä centosissa, puuttuu varmaan joku repo. Kun aloin googlaamaan niin en löytänyt mitään selkeää ratkaisua, ja tässä kohtaa aika on niin vähissä että minulla ei ole enään aikaa yrittää myöskään korjata tätä. Tämän takia en tulekkaan enään tekemään tätä CentOSsille.

Kaksi uutta ideaa

Koska kokonaisuus tähän mennessä ei ole ollut erittäin haastava/mielenkiintoinen, minulla oli vielä kaksi ideaa mitä voisin lisätä tähän moduuliin. Voisin tehdä custom ääniä pychessiin niin että aina vaikka kun nappula syödään niin se pelaa meidän custom äänen.

Toinen idea oli laittaa koko /srv/salt githubbiin, joka oli myös aiempi tehtävä jota en koskaan tehnyt. Tämä on ehkä bonus jonka tulen tekemään, en ole varma. Mutta aion tehdä nuo custom äänet.

Custom äänet

Ensinnäkin meidän pitää saada tämä toimimaan yhdellä koneella, kun saamme sen toimimaan yhdellä niin monistaminen saltilla ei pitäisi olla vaikeaa. Mennään ensin pychessin asetuksiin ja tutkitaan mitä sieltä löytyy:

Äänet pystyy valitsemaan täältä eri asioihin. Seuraavaksi meidän pitää vain onnistua saamaan oma äänemme tuonne ja sitten tehdä sama minioneille. Kaikki äänitiedostot näyttävät olevan samassa kansiossa, /usr/share/pychess/sounds:

Ajattelin että custom sound soisi silloin kun pelaaja syö vihollisen nappulan. Löysin kivan pienen äänen sivustolta freesound.com. Ääni mitä käytän on tämä: https://freesound.org/people/BerlinGameScene/sounds/267249/ (Lähde 4).

En voi tässä näyttää kyseistä ääntä, mutta kyseessä on ääni jossa ihmiset taputtavat ja ovat “ihmeissään”. Aika ilmeinen sillä tavalla että tämä on custom ääni. Teen myöhemmin videodemon moduulista jossa äänen pitäisi kuulua normaalisti. Siirsin äänen virtuaalikoneelle jonka jälkeen myös siirsin sen oikeaan kansioon, eli tuohon aiemmin mainittuun /usr/share osoitteeseen. Uuden äänen pitäisi nyt olla pychessin asetuksissa, mennään katsomaan:

Tuo cheer.ogg on se jonka juuri äsken lisäsin. Laitetaan päälle ja kokeillaan että ääni toimii. Menin yhteen shakkipeliin, ja uusi ääni toimi tahdotusti. Tässä kohtaa joudutte luottamaan siihen, sillä en pysty vielä demoamaan sitä mitenkään.

Muistan nähneeni .ogg tiedostoja aiemmin pychessin config tiedostossa, joten käydään ensin katsomassa löytyisikö tämä muutos sieltä.

Näyttää päivittyneen onnistuneesti. Tässä kohtaa meidän ei oikeastaan tarvitse tehdä mitään muuta kuin 1. päivittää esimerkki config tiedosto tällä uudella ja 2. saada minioneille tuo oikea tiedosto.

  • 1. päivittää esimerkki config tiedosto tällä uudella
  • 2. saada minioneille tuo oikea tiedosto

Tämä hoituu oikein helposti kahdella komennolla:

sudo cp /usr/share/pychess/sounds/cheer.ogg /srv/salt/chess_module/cheer.ogg
sudo cp config /srv/salt/chess_module/config

Nyt molempien tiedostojen pitäisi olla tuolla /srv/salt/chess_module/ kansiossa. Vielä yksi lisäys on kuitenkin tehtävä init.sls tiedostoon:

Tuo punaisella merkitty on siis meidän uusi lisäys jossa varmistamme että minionilla on myös oikea äänitiedosto. Kaiken pitäisi toimia nyt! Voimme laittaa state.apply ja katsoa mitä tapahtuu:

Ei virheitä. Vielä viimeiseksi meidän pitää mennä minionille ja tarkistaa että uusi äänitiedosto on tosiaan käytössä (tästä demo videokohdassa!).

Videodemo moduulista

Tietysti on vaikea todeta että “kyllä, meidän moduuli toimii” kun emme voi todistaa sitä tässä wordpress sivulla oikeastaan mitenkään. Tämän takia olen tehnyt youtube videon moduulin toiminnasta ja tulen sen avulla näyttämään että kaikki toimii tahdotusti.

Linkki youtube-videoon: https://www.youtube.com/watch?v=RTyGLIlxYkw .

Videossa ollaan nopeasti demottu miten moduuli toimii ja mitä se tekee + todistetaan että äänet ovat muuttuneet niinkuin ajattelimme.

Lopulliset ajatukset

Ikävä kyllä päällekkäin menevät deadlinet estivät suuremman moduulin työstämisen, ja kuten olen jo aiemmin maininnut olin hieman turhautunut siihen että en saanut jotain monimutkaisempaa ongelmaa ratkaistua, koodihan tässä oli kovin simppeliä lopulta. Turns out oikeita ongelmia on vaikeampi keksiä kuin ratkaista!

Tämä moduuli kuitenkin demosi saltin periaatetta mielestäni aivan oivasti, vaikka lopputulos ei nyt ollutkaan mikään erityisen monimutkainen. Pääsin silti hyödyntämään monia erilaisia taitoja mitä kurssilla opin: ehkä olisi vielä ollut kiva jos olisin jotenkin saanut ohjelman myös toimimaan RedHatilla niinkuin alunperin oli tarkoitus, mutta ikävä kyllä paketinhallinnan kanssa säheltäminen itselle tuntemattomalla käyttöjärjestelmällä osoittautui hieman liian haastavaksi, varsinkin kun en löytänyt mitään erityistä apua kyseistä pakettia varten.

Lähteet:

Lähde 1: https://pychess.readthedocs.io/en/latest/

Lähde 2: https://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html

Lähde 3: https://regexr.com/

Lähde 4: https://freesound.org/people/BerlinGameScene/sounds/267249/

Tunkeutumistestaus läksyt viikko 7 – Caius Juvonen

Tällä kertaa teemme tämän kurssin viimeiset läksyt! Olemme päässeet pitkälle ja oppineet paljon, ja toivon että pääsen hyödyntämään näitä taitoja pian tulevaisuudessa positiivisesti. Linkit teron kurssiin ja läksyihin tässä: http://terokarvinen.com/2020/tunkeutumistestaus-kurssi-pentest-course-ict4tn027-3003/ . Sama linkki myös lopussa.

a) Web fuzzing. Asenna fuff ja käytä sitä valitsemaasi harjoitusmaaliin. Kokeile eri tyyppisiä fuzzingeja, fuff kohteiksi voi laittaa esimerkiksi kansiot, alidomainit, parametrien nimet, parametrien arvot tai lomakkeiden käsittelijät. Asenna itse tarvittavat harjoitusmaalit.

Päätin asentaa juice-shopin dockerin avulla koska kuulin huhua että se olisi hyvä kohde fuzzaukseen. Lähdetään liikkeelle juice-shopin asennuksella:

Ensinnäkin, meillä pitää olla docker asennettuna. En nyt käy sitä tässä läpi, sillä minulla on jo docker. Kun olemme asentaneet dockerin, voimme asentaa juice-shopin näillä komennoilla:

sudo systemctl start docker
sudo docker pull bkimminich/juice-shop
sudo docker run -d -p 3000:3000 bkimminich/juice-shop

Ensimmäiseksi käynnistämme dockerin systemctl avulla. Seuraavaksi otamme docker-imagen pullin avulla, eli tämä on se “asennus”. Viimeinen komento käynnistää juice-shopin laitteellamme portille 3000. Jos haluamme nyt siis uudestaan käynnistää dockerin, käytämme vain ensimmäistä ja viimeistä komentoa (olettaen että docker ei ole vielä päällä, jos on, niin vain viimeinen riittää). Tämän jälkeen juice-shopin pitäisi pyöriä localhostilla portilla 3000. http://localhost:3000 näyttää tältä:

Pieni huomio on että mikäli foxyproxy on selaimessa laitettu toimimaan localhostiin, pitää sen asetukset ottaa pois mikäli proxyä ei olla laitettu toimimaan ensin kyseiseen porttiin, eli kannattaa se ottaa pois päältä (itsellä kävi näin ja olin hetken hämmentynyt).

Ffufilla voi tehdä monia erilaisia asioita, joten aloitan jostakin simppelistä kuten directory discoverystä. Käytin tässä lähteenä tätä: https://github.com/ffuf/ffuf (Lähde 1). Voimme käyttää komentoa

./ffuf -c -w /usr/share/dirbuster/wordlists/directory-list-2.3-small.txt -u http://localhost:3000/FUZZ/ -fs 1925

Olen asentanut ffufin ohjelmana ja joudun käyttämään sitä myös näin. -c vain värittää outputin eli kyseessä ei ole mikään pakollinen parametri, -w on pathi meidän wordlistaan jota käytämme directoryjen löytämiseen (käytin default wordlistaa joka tulee kalin tai siis dirbusterin mukana), ja -u on hosti. Hyvä huomata että urlin perään on lisätty /FUZZ/ joka on siis pakollista. -fs 1925 filteröi kaikki löydöt joiden size on 1925, sillä huomasin että se on false positive ja jos sitä ei ole ffuf kertoo että jokaikinen mahdollinen sana on directory websitellä. Tuolla parametrillä saa kaikki false positivet pois hämäämästä.

Ffuf on ikävä kyllä erittäin hidas tähän. Sillä meni yli puoli tuntia käydä noin 81 tuhatta eri sanaa läpi tässä hyökkäyksessä. Ehkä käytin sitä väärin, mutta gobuster saavuttaa saman tuloksen paljon nopeammin. Tulokset kuitenkin toimivat, mutta isommalla sanalistalla tässä menisi ikuisuus kun odottaisin vastausta. Tulokset tässä:

Kävin muutamassa noista, ja näyttivät toimivan. Varsinkin /ftp oli hauska, sillä sinne oli laitettu “confidential” asiakirjoja kaikkien luettaviksi. Löysin myös jotain tiedostoja joiden nimessä oli malware, mutta en lähtenyt niitä tutkimaan sen enempää koska tässä oli vain tarkoitus tutkia tuota ffufia ja sen käyttöominaisuuksia.

Tämän jälkeen oli tarkoitus kokeilla jotain muuta, mutta tässä välissä haluaisin sanoa että työkalu on hieman epäselvä ja myöskin viimeistelemätön, ja käyttäisin mielellään jotain muuta työkalua tässä. Päätin tuolta samalta github pagelta ottaa toisen esimerkin, tällä kertaa POST data fuzzing.

Juiceshopissa on login page, joten tämä on meidän kohteemme. Kokeilin miten SQL injektiot toimisivat, joten tein seuraavan komennon:

./ffuf -w /usr/share/wordlists/wfuzz/Injections/SQL.txt -u http:/192.168.56.101/mutillidae/index.php?page=login.php -X POST -d "username=admin\&password=FUZZ"

Tarkkasilmäinen lukija on tässä kohtaa varmasti huomannut, että emme hyökkää juice shoppia vastaan enään. Tämä sen takia että parametri -X POST toimii vain palveluihin jotka ovat portilla 80: juice shop on portilla 3000. En tiennyt miten saisin tämän toimimaan, joten vaihdoin kohdetta metasploitable-laitteeseen. Ja siis tuo -X parametri spesifioi meidän HTTP methodin, login pagea vastaan tietysti tuo POST on olennainen (GET on default).

Saamme tälläisen tuloksen:

ffuf on siis kokeillut kaikenmaailman SQL injektiota login pagea vastaan, joka käsittääkseni toimii. Oma mutillidaeni on sen verran rikkinäinen että siinä en saa loginia toimimaan vaikka kokeilisin oikeilla salasanoilla, mutta oletan että tämä hyökkäys silti onnistui. Eli siis, ffuf kokeili login pageen erilaisia sql injektioita meidän wordlistasta.

En päässyt ihan täysin hyödyntämään tätä työkalua sen täyteen potentiaaliin, mutta voin sanoa että fuzzerit vaikuttavat erittäin hyödyllisiltä työkaluilta jos haluaa nopsaan automatisoida heikkouksien etsimisen, vaikka ei siihen kannatakkaan luottaa aina. Fuzzerit antavat paljon false positiveja ja jättävät välillä oikeita vulnerabilityjä huomaamatta, mutta tällä pääsee alkuun mikäli pitää korkata vaikka joku web applikaatio. Tulen varmasti käyttämään fuzzereita tulevaisuudessa, mutta en ole varma käytänkö tätä kyseistä työkalua vaikka wfuzzin yli.

b) Muistilappu. Kokoa vanhoista harjoitustehtävistä tiivis, sähköinen muistilappu. Laita komennoista kokonaiset, toimivat esimerkit. Tavoitteena on tehdä sellainen muistilappu, josta on itsellesi hyötyä, kun teet tunkeutumistestausta käytännössä.

Olen ennenkin tehnyt tämmöisiä cheatsheet tyyppisiä muistilappuja ja tulen jakamaan tässä niitä hieman eri kategorioihin.

Tiedustelu/recon:

nmap // Porttiskanneri, yksi tärkeimmistä työkaluista mitä on. Tulee Kalin mukana, man nmap. Esimerkkikomento:

nmap -A -oA nmap_skan 10.10.10.100

Tämä skannaa osoitteen 10.10.10.100 ja tekee myös version detectionin, script skannin ja OS detectionin. Eli saamme kaiken mahdollisen tiedon kohteesta. Tulokset tallennetaan 3 eri formattiin tiedostoon nimeltä nmap_skan -oA parametrin avulla. HUOM. Port skannaus on äänekästä toimintaa ja suomessa myös laitonta! Kaikki skannit kannattaa tallettaa tiedostoon, koska et halua joutua tekemään niitä uudestaan.


Gobuster // Brute force työkalu jota voi käyttää directoryjen löytämiseen, gobuster toimii terminaalissa ja dirbuster on GUI versio, muuten sama ohjelma kyseessä. Jos ei tiedä mitä kannattaa tehdä web applikaation korkkaamiseksi, on hyvä aloittaa gobusterskannilla. Esimerkkikomento:

gobuster dir -v -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -u https://kohde.com

Hyvä huomata että dirbusterin mukana tulee directory sanalistoja jota voi käyttää myös gobusterin kanssa, sijaitsevat tuolla /usr/share/dirbuster kansiossa. Huom, on tärkeää laittaa sana "dir" gobusterin jälkeen, sillä tuo kertoo mitä moduumia käytetään. Gobuster -h lisätietoja varten. -w on wordlist path, -v on verbose mode ja -u on kohteen url. 

Huom. Kannattaa myös vaikka manuaalisesti käydä kurkkaamassa robots.txt tiedosto ja katsoa mitä sinne on laitettu. Jos onnistaa siellä voi olla suoraan vaikka admin login page. 


nikto // niktoa voi käyttää vaikka vanhojen komponenttien havaitsemiseen webbi applikaatiossa, jolla voi saada viittaa siitä mistä kannataisi lähteä liikkeelle. Esimerkkikomento:

nikto -Display 1234V -Tuning 6x -o niktoskan.html -Format htm -host 10.10.10.165

niktoa on hieman vaikeampi käyttää (tai siis, siinä on paljon parametrejä), mutta sen man sivu selittää kaiken aika hyvin. Tässä esimerkkikomennossa on otettu Display asetukset 1234 ja V mukaan, Tuningissa kaikki paitsi asetus 6 (x on reverse, eli kaikki paitsi spesifioitu) ja -o tallentaa outputin tiedostoon nimeltä niktoskan. Myös output tiedoston format on kerrottava, ja se on tässä tapauksessa html (htm oikea syntaksti -formatissa, nikto toimii niin). -Host:issa vain kerrotaan meidän kohteemme. 

Tämä on gobusterin kanssa toinen työkalu mitä käyttäisin web applikaation tutkimiseen heti alkuun. On myös muistettava että myös nmap on tärkeä webbiservereiden kanssa! 


mitmproxy // Mitmproxy on välimiesproxy jolla voimme interceptata get/post requesteja ja muokata niitä ennenkuin lähetämme niitä eteenpäin. Tämän avulla myös vaikka command injection on mahdollista, sillä voimme muokata post requestia miten haluamme. Itse käytän mitmproxyn kanssa myös foxyproxya joka tekee sen käytöstä helpompaa. Pieni tutoriaali miten mitmproxyä käytetään:

Ensinnäkin laita foxyproxy asetukset kuntoon ja asenna mitmproxy. Tero Karvisella on hieno artikkeli missä hän kuvaa miten tämä toimii: http://terokarvinen.com/2019/mitmproxy-on-kali-and-xubuntu-attack-and-testing (Lähde 2). 

Kun mitmproxy on päällä ja toimii, niin tässä muutama neuvo sen käyttöön liittyen:

Mitmproxy käynnistetään tyyliin "mitmproxy -P (portti tähän)

-Painamalla nappia "i" pystyy asettamaan intercept filterin, eli voimme kaapata kaikki paketit jotka täyttävät tietyt ehdot (esim POST requestit). Jos kaappaa kaiken sivulta tulevan niin sivusto ei tietenkään lataa vaikka uutta nettisivua ennenkuin päästät datan eteenpäin.

-A päästää kaikki napatut paketit eteenpäin, pieni a jonkun tietyn. 

-Valitsemalla jonkun tietyn flown ja painamalla "e" pystyy muokkaamaan asioita sen sisällä. Tämän avulla voimme esimerkiksi tehdä command injectionin mikäli sivu sen sallii (note: on siis haavoittuvainen). 

Mielestäni nämä olivat kaikista tärkeimmät napit mitmproxyn käytössä. Huom: http requestit pitää interceptata mikäli niitä haluaa muokata, sillä eihän niitä voi muokata sen jälkeen kun ne on jo lähetetty eteenpäin. Mitmproxyn avulla voimme käyttää myös muita työkaluja, kuten vaikka hydraa joka toimiakseen tarvitsee välimiesproxysta saatuja tietoja. 

Brute force

Kaksi työkalua jotka tulevat ehdottomasti mieleen ovat hydra ja hashcat.

Hydra // Hydraa käytetään enemmänkin web brute forcessa, eli jos löydetään vaikka wordpress login page voimme käyttää hydraa sen brute forceemiseen. Hydra tulee kalin mukana ja siinä on olemassa myös sen oma man-page. Esimerkkikomento:

hydra -vV -L fsocity.dic.uniq -p wedontcare -o usernames.txt 192.168.56.104 http-post-form '/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log+In:F=Invalid username'

Aika pitkä komento, mutta ei niin monimutkainen lopulta! -vV on vain verbose, -L on sanalista mitä käytämme loginin selvittämiseen, -p on salasana mitä käytämme (iso P käyttää salasanalistaa, vice versa pienen l kanssa), -o tallettaa tiedot tiedostoon, IP pitää myös antaa mutta se ei tarvitse omaa parametriään ja lopuksi tarvitsemme http-post-formin. Tämän voi saada esimerkiksi mitmproxyn avulla. Hydran kanssa toimimiseen on suositeltavaa käyttää jotain välimiesproxyä noiden post requestien saamiseen. 


Hashcat // Toisinkuin hydra, hashcattia käytetään lähinnä hashien murtamiseen ja tämä tapahtuu siis ihan paikallisesti. Jos saat salasanahashin, kannattaa käyttää hashcattia sen murtamiseen sillä hashcat pystyy käyttämään GPU:ta, nopeuttaen prosessia huomattavasti. Ei toimi virtuaalisessa ympäristössä, kannattaa tehdä host koneella, toimii myös windows 10. Esimerkkikomento:

hashcat64.exe -m 0 -a 0 -w 3 -o cracked_battlefield.txt hashes/bfield.hash passwordlist/rockyou.txt

Tämä on suoritettu windows 10, joten tuo hashcat64.exe on miten kutsumme komennon. Linuxissa pelkkä hashcat riittää. -m 0 spesifioi mitä modea käytämme, ja tämä riippuu täysin hashin tyypistä, eli hashin tyyppi pitää ensin selvittää ennenkuin voimme lähteä sitä ratkomaan. -a päättää mitä hyökkäystapaa käytämme, 0 on dictionary attack eli salasanalista. -w on workload profile, mutta tämä ei toiminut kunnolla testatessani. Tarkoituksena on että workload profiililla voi säädellä kuinka paljon koneen tehoja hashcat käyttää. -o on output file, ja lopussa on vain tuo meidän hashitiedosto ja salasanalista mitä käytämme niiden murtamiseen. Man sivulta saa helposti lisää tietoa noista parametrin asetuksista. 

Exploiting

Tässä kuvataan miten voimme käyttää valmiita/itsetehtyjä exploitteja. Metasploit pääasemassa.

Metasploit // Metasploit on varmaan käytännöllisin työkalu jonkun exploitin käyttämiseen, eli tämä on mitr killchainissa kohta "weaponization". Metasploitin mukana tulee valmiiksi tuhansia eri moduuleita ja exploitteja, ja siihen voi ladata myös custom-made payloadeja.

Metasploitin käynnistämiseen kannattaa käyttää jotain tämänlaista skriptiä, koska monta eri asiaa pitää käynnistää samalla:

#!/bin/bash

systemctl start postresql
msfdb init
msfconsole

Voi nuo kolme komentoa myös yksitellen kirjoittaa, mutta näin säästyy hieman aikaa ja jos unohtuu vaikka joku noista niin ei jää mietityttämään sen enempää. Skriptin voi juosta helposti vaikka tyyliin: "sudo ./skripti". 

Pari hyödyllistä komentoa metasploitin sisällä:

- search // tällä voi etsiä moduuleita, esim "search vsftpd". 
- use // tämän avulla voi ottaa jonkun tietyn moduulin käyttöön, jos on käyttänyt searchia juuri ennen sitä numerot käyvät, muuten pitää kirjottaa koko moduulin path, esim "use exploit/unix/vsftpd_234_backdoor
- options // tätä kannattaa käyttää aina kun on ottanut moduulin/exploitin käyttöön, sillä se näyttää tarvittavat asetukset.
- set // Setillä voi laittaa asetukset kuntoon jostain moduulista. Jos moduuli esimerkiksi tarvitsee kohde-IP:n ja tämän asetuksen nimi on RHOSTS käyttäisit "set RHOSTS 10.10.10.100". 
- run/exploit // Kun kaikki asetukset ovat valmiita näillä voi juosta kyseisen exploitin/moduulin eli käynnistää hyökkäyksen. 

Olen lähinnä käyttänyt metasploitissa valmiiksi olevia hyökkäyksiä, eikä minulla ole kokemusta ihan hirveästi omien tekemisestä, joten jätän sen tähän mainitsematta kunnes olen päässyt tekemään lisää tämän tyyppistä toimintaa. 

Tässä ainakin suurin osa kurssillä käydyistä ohjelmista ja komennoista jotka ovat mielestäni hyödyllisiä. Tärkeintä on kuitenkin varmaan kyky oppia käyttämään uusia työkaluja, dokumentaation lukeminen + man sivut auttavat huomattavasti ja olen kurssin aikana oppinut käyttämään todella montaa eri työkalua aivan itse.

Post exploitatiota ei käyty kurssilla niin paljoa läpi, ja en osaa vieläkään enumerationia kauhean hyvin (tai siis, voin ehkä murtautua laitteeseen, mutta en kyllä osaa saada sillä roottia mikäli se ei tullut hyökkäyksen mukana). Tämän on varmaan jotain mitä minun kannattaa käydä läpi omalla ajalla sitten enemmän. Myös web applikaatiot kiinnostavat.

c) Viisauksia keräämässä. Silmäile muiden kotitehtäväraportit ja kerää uuden otsikon alle muistilappuusi kiinnostavimmat komennot. Muista lähteet.

Tuomo Kuure:

Käyn siis muiden kurssilaisten läksyjä läpi ja katson mikäli siellä olisi jotain uutta mitä en ole itse käyttänyt, ja kerään hieman tietoa siitä tähän.

Kävin ensin toisen kurssilaisen Tuomo Kuuren blogissa, ja huomasin siellä jotain jonka olin itse unohtanut: tshark. Tällä työkalulla voimme siis tarkkailla vaikka meidän omaa internetliikennettämme ja päätellä mikäli jokin on pielessä. Tämä kyseinen kohta löytyy Tuomon blogista täältä (Lähde 3).

sudo tshark -i (interface) 

Tshark on siitä käytännöllinen että sillä on helppo tarkailla verkkoliikennettä, jotta näemme mitä ohjelmamme oikeasti tekevät (ja varmistutaan siitä että porttiskannaus ei vahingossa vaikka lähde ulkopuoliseen osoitteeseen!).

Niko heiskanen:

Halusin myös lisätä Nikon hashcat käytön jossa hän lisäsi hashcattiin sääntöjä sanalistan lisäksi. Tämä vaikutti hyvin tehokkaalta tavalta käyttää hashcattia jotta saisimme enemmän irti jostain salasanalistasta. Linkki Nikon blogiin on tässä: https://heiskane.github.io/h6.html (Lähde 4). Tuo on myös missä tätä hashcat rulea on käsitelty.

Eli meillä on salasanalista ja rulelistan avulla voimme tehdä täysin uuden salasanalistan sen avulla. Tässä rulelistassa voi olla monia erilaisia sääntöjä, kuten vaikka että jokainen salasana on myös full CAPSilla tai että jos salasanan ensimmäinen kirjain ei ole isona, se tekee sen myös isona. On tietysti huomattava että säännöt lisäävät salasanojen määrää huomattavan määrän, joten ei kannata pistää jokaista mahdollista sääntöä jo valmiiksi suuren salasanalistan päälle.

Uuden salasanalistan voi luoda sääntölistan avulla seuraavasti: “.\hashcat64.exe -r .\rules\best64.rule –stdout .\rockyou.txt > rockyou2.txt“. Eri säännöt mitä sääntölistassa on mahdollista käyttää on lueteltu täällä: https://hashcat.net/wiki/doku.php?id=rule_based_attack (Lähde 5). Tämä on hyödyllistä sen takia että kapitalisaatio on tietysti erittäin tärkeää salasanojen kanssa, ja jos salasanalistassa on salasana “hunter2” mutta käyttäjä käyttääkin “HUNTER2” ei sitä voida crackata. Säännöillä voidaan kuitenkin lisätä nuo yleisimmät muutokset.

d) Viimeistely. Käy vanhat kotitehtäväsi läpi. Tarkista, että olet viitannut lähteisiin: tehtäväsivuun, kurssiin, muiden opiskelijoiden raportteihin, man-sivuihin, kotisivuihin ja ylipäänsä kaikkiin käyttämiisi lähteisiin. Lähdeviite tulee olla jokaisessa artikkelissa, jossa lähdettä on käytetty. Mikäli teet kotitehtäviisi lisää testejä tai kokeiluja, tee ne selkeästi jatkoksi uuden otsikon alle ja merkitse, milloin lisäykset on tehty. Historia ei voi enää muuttua.

Olin unohtanut aikaisista raporteistani linkin ainakin kurssisivuun, jonka menin lisäämään jokaiseen. Muitakin lähteitä oli puuttunut, mutta ne lisättyäni en nähnyt niin paljoa “virheitä” töissäni, ja olin ihan tyyväinen kaikkiin. Käyn usein tehtäväni läpi ennen julkistamista, joten kirjoitusvirheitä ainakin toivottavasti jää tekstiin usein hyvin vähän.

Lähteet:

Lähde 1: https://github.com/ffuf/ffuf

Lähde 2: http://terokarvinen.com/2019/mitmproxy-on-kali-and-xubuntu-attack-and-testing

Lähde 3: https://tqre.wordpress.com/2020/05/16/h7-cheat-sheet-and-web-fuzzing/

Lähde 4: https://heiskane.github.io/h6.html

Lähde 5: https://hashcat.net/wiki/doku.php?id=rule_based_attack

Caius Juvonen 2020

Tunkeutumistestaus läksyt viikko 6 – Caius Juvonen

Tässä postauksessa tehdään taas Tero Karvisen tunkeutumistestaus-kurssin läksyjä. Läksyt on täältä: http://terokarvinen.com/2020/tunkeutumistestaus-kurssi-pentest-course-ict4tn027-3003/ . Linkki myös lopussa.

a) Murra salasanoja tiivisteistä. Kokeile erilaisia salasanojen tiivisteitä ja eri ohjelmia (esim. hashcat, john). Toimiiko hashcat koneellasi GPU:lla? Miten GPU:n käyttö vaikuttaa nopeuteen?

Ensinnäkin tarvitsen tiivisteitä mitä voisin murtaa. Latasin md5 hash listan internetistä, linkki tässä (Lähde 1). Tiedosto on 7zip muodossa, joten meidän täytyy ensin purkaa se. Tein uuden kansion sitä varten, ja purin tämän .7z tiedoston komennolla:

7z x left_md5crypt.7z

ja saimme tämän avulla md5crypt.txt tiedoston, eli tekstitiedoston missä on hashit. Nyt meidän pitää vain alkaa murtamaan salasanoja. Hashcat tulee kalin mukana, ainakin ymmärtääkseni. Yksi ongelma: hashcat ei pysty käyttämään koneeni oikeita tehoja virtuaalisessa ympäristössä, joten en itseasiassa edes ole täysin varma miten tämä kannattaisi tehdä. Päätin lopulta kuitenkin eka yrittää murtaa tätä hash listaa virtuaalisessa ympäristössä, ja sen jälkeen hosti koneella.

hashcat -m 0 -a 3 -o crack.txt --force

Luin man pagea ja kasasin kyseisen komennon. -m spesifioi hash tyypit, ja tässä oli kyseessä md5 jonka koodi oli 0. -a spesifioi attack moden, 3 on brute force. -o kertoo meille output filen, ja –force pakottaa ohjelman juoksemaan virheistä huolimatta. Laitoin komennon pyörimään ja hirveä kasa keltaista tekstiä alkoi juoksemaan terminaalia pitkin. Tässä kuvakaappaus:

Käsittääkseni tämä tarkoittaa että hashcat ei tunnistanut hash tyyppiä, joten tämä ei onnistu. Terminoin komennon ja katoin man pagea uudestaan. Googlasin mikä hash type tuo $1$ on ja löysin tämän sivun: https://passlib.readthedocs.io/en/stable/lib/passlib.hash.md5_crypt.html (Lähde 2). Kyseessä onkin siis md5crypt, ei md5. Muutetaan tuossa aiemmassa komennossa -m 0 -> -m 500

Tällä kertaa onnistuimme ehkä “hieman” paremmin, mutta saimme seuraavan virheen:

Virtuaalikoneelta selkeesti on loppumassa happi ainakin brute forceen. Kokeilen seuraavaksi word list hyökkäystä. Uusi komentoni:

hashcat -m 0 -a 0 --force -o crack.txt md5crypt.txt /usr/share/wordlists/rockyou/rockyou.txt

Sama ongelma tuli taas, eli insufficient memory. Tässä kohtaa luovutin ja latasin toisen hash listan joka on hieman kevyempi. Kävin etsimässä täältä kevyemmän listan: https://hashes.org/hashlists.php (Lähde 3), ja otin sellaisen jossa oli vähän päälle 80k hashia, eli ei hirveän montaa.

Kokeilin sitäkin, tällä kertaa kyseisellä komennolla:

hashcat -m 0 -a 0 --outfile-format 2 -o crack.txt kevytlista.txt /usr/share/wordlists/rockyou/rockyou.txt

Ja nyt kun poistin –force parametrin, lopullinen ongelma selvisi:

Eli emme pysty tekemään tätä virtuaalikoneen kanssa koska hashcat ei löydä GPU:ta. Tässä kohtaa luovutin kyseisen ympäristön parissa painimisen, ja vaihdoin taktiikkaa niin että lataan hashcatin hosti koneelle ja murran nämä listat sillä.

Latasin hashcatin täältä: https://hashcat.net/hashcat/ (Lähde 4).

Seuraavaksi meidän pitää vain avata windows terminaali ja navigoida sinne mihin olen extractannut hashcatin, ja sen jälkeen voimme käyttää sitä windows terminaalilta kutsumalla hashcat64.exe:n, esim: “hashcat64.exe -m0 -a0 -o cracked.txt hashes.txt“. Samanlainen toimivuus siis kuin linuxilla. Latasin saman hashilistan kuin tuo kevytlista.txt aiemmassa kohdassa.

Käytin aluksi komentoa

hashcat64.exe -m 0 -a 0 -o cracked.txt kevytlista.txt rockyou.txt

Mutta hashcat kokoajan palautti pelkästään “exhausted” statuksen, eikä tehnyt siis yhtään mitään. Mietin pitkään mikä tässä on ongelmana, kunnes kokeilin tehdä omaa dictionary attackiani. Käytin sivustoa md5hashgenerator.com (Lähde 5) hashin tekemiseen sanasta “password” ja sitten tein oman salasanalistani missä oli pelkästään sana password, ja juoksin hashcatilla komennon

hashcat64.exe -m 0 -a 0 -o cracked.txt password.txt salasanalista.txt

ja kyllä, hashcat mursi tämän oikeastaan heti. Uskon siis että jotain vikaa oli tuossa salasanalistassani jonka olin saanut aiemmin, koska hashcat silti näyttäisi toimivan. Tässä kohtaa en ihan tiedä mistä keksisin jonkun md5 password hash tiedoston minkä voisin crackata. No, löysin vielä yhden jota ajattelin kokeilla täältä (Lähde 6). Otin tuolta Battlefield-hashes vuodelta 2013.

Tämä on näköjään oikea md5 lista, joten laitan komennon

hashcat64.exe -m 0 -a 0 -w 3 -o cracked_battlefield.txt hashes/bfield.hash passwordlist/rockyou.txt

Ainut uusi parametri on tuo -w 3, ja se kertoo että käyttää enemmän koneen tehoja. Maximi on 4, mutta en halunnut puskea systeemiä liian pitkälle. Tosin, tästä riippumatta hashcat ei käyttänyt GPU:tani sen rajoille juuri ollenkaan, itseasiassa vain 6% utilization. Mutta hashcat oli silti nopea ja teki dictionary attackin hasheja vastaan ja sai ison listan crackattuja salasanoja.

Tuossa lopullinen tuloste hashcatilta. Jos luen tätä oikein, niin sain 28.25% salasanoista crackattua rockyou.txt avulla, eli aika tehokas salasanalista. Hashcat käytti tässä GPU:tani, tosin aika pienellä teholla silti. Tuossa speed näyttäisi olevan 66983 H/s eli yli 65 tuhatta hashia sekunnissa. Olisi tietysti kiva jos hashcat käyttäisi GPU:ta vaikka 60% utilizationilla eli 10 kertaa enemmän, mutta en löytänyt miten näin voi tehdä.

b) Murra salasanoja omalla koneellasi olevista palveluista. Esimerkiksi ssh:sta ja HTML-lomakkeelta. (esim. hydra). Ole huolellinen, että osoitat ohjelmalla vain luvallisia harjoitusmaaleja; voit käyttää esim. localhost-osoitetta harjoitteluun.

Ajattelin käyttää hydraa tässä ja tehdä pari erittäin heikosti suojattua ssh käyttäjää mihin voisin murtautua. Teen kolme käyttäjää kohdekoneelle, joiden nimet ja salasanat ovat seuraavat:

ssh1:password
ssh2:123456
ssh3:letmein

Eli huomattavan vulnerable salasanoja. Murtaisin myös nuo usernamet mutta minulla ei ole mitään fiksua salasanalistaa missä nuo usernamet esiintyy: olisihan nekin voinut varmaan ottaa jostain salasanalistasta, mutta sinänsä usernamien murtamisessa ei ole mitään eroa.

Katsoin apua hydran käyttämiseen täältä: https://linuxconfig.org/ssh-password-testing-with-hydra-on-kali-linux (Lähde 7). Aion käyttää dictionary hyökkäystä tässä esimerkissä, ja teen sen komennolla

hydra -L nimet.txt -u -P /usr/share/wordlists/fasttrack.txt 10.0.2.15 ssh

Nopea selitys komennosta. -L spesifioi usernamet, ja tässä käytän tiedostoa nimet.txt jossa on nuo kolmen juuri tekemän accounttini nimet. -u muuttaa miten hydra kokeilee salasanoja, ja tällä asetuksella se kokeilee jokaista salasanaa jokaista käyttäjää vastaan ja sitten liikkuu seuraavaan salasanaan. -P käyttää kalin mukana tulevaa wordlistaa fasttrack.txt joka on pienempi salasanalista jossa on kaikki yleiset salasanat (näiden pitäisi löytyä sieltä). 10.0.2.15 on toinen virtual hostini joka on samassa lähiverkossa ja ssh kertoo mitä palvelua vastaan hyökkäämme, eli ssh. Katsotaan mitä komento saa aikaan:

Hydra löysi kaikki tekemäni salasanat hieman alle minuutissa. Tämä oli kuitenkin aika hidasta ottaen huomioon että nuo salasanat olisi normaalisti pitänyt murtaa sekunnissa, joten hydra ssh:n kanssa ei ole kauhean nopea. Se oli kyllä paljon nopeampi wordpressin kanssa kun kokeilin viime viikon tehtävissä hydraa wordpress login pagea vastaan.

c) Etsi paikallisia salasanoja sivuttaissiirtymää varten. (esim LaZagne, mimikatz, meterpreter hashdump)

En ole ihan varma mikä sivuttaissiirtymä on, mutta oletan että teemme vain näillä työkaluilla sitä mitä niillä on tarkoituskin tehdä, eli tutkitaan ensin mitä nämä tekevät ja sitten käytetään.

Halusin kokeilla tätä meterpreterin kanssa, joten tarvitsen ensin kohteen mihin yhdistän, ja päätin käyttää metasploitable 2 laitetta koska siihen on helppo murtautua enkä silloin tarvitse mitään isoa setuppia. Hyökkään metasploitable 2 laitteeseen moduulilla unrealIRCd eli “use exploit/unix/irc/unreal_ircd_3281_backdoor“. Vielä sen jälkeen set RHOSTS 192.168.56.101, ja olemme valmiita. Exploit -j, sillä haluamme jättää tämän session backgroundille. Sen jälkeen voimme nostaa sen meterpreter sessioksi komennolla “session -u 4“. Tuo 4 on vain session numero, meni pari kertaa kokeiluksi joten sen takia se on noin suuri, komennolla “sessions” näkee kaikki omat sessiot.

Tuossa siis omani, eli meillä on nyt meterpreter sessiokin kohteessa. Seuraavaksi otetaan hashdump esiin, ja laitetaan se käyttöön komennolla “set post/linux/gather/hashdump/“. Sen asetukset (jotka näemme komennolla options):

Pitää vain kertoa meterpreter sessionin ID, eli meidän tapauksessa 6.

Nyt olemme valmiita. Pelkkä komento run riittää.

Tuo keräsi meille informaatiota järjestelmästä ja sen käyttäjistä sekä niiden salasanoista. Voimme käyttää tuota tehtyä tiedostoa salasanojen crackkaamiseen. Tältä tuolla metasploitin tekemässä tiedostossa näyttää:

Tuosta nyt on sinänsä hieman hankala lähteä hasheja poimimaan muuta kuin käsin, tai ainakaan itellä ei ole grep tai regex niin hyvin hallussa että tuosta saisi ne järkevästi otettua. Jos käytämme hash-identifier ohjelmaa tuohon msfadminin hashiin niin saamme seuraavan tuloksen:

Hash-identifier ohjelma siis toimii todellakin niin yksinkertaisesti että jos kalissa kirjoittaa hash-identifier terminaaliin niin ohjelma käynnistyy, ja silloin vaan voi copy pasteta tuon hashin ja se yrittää kertoa mikä hashtyyppi on kyseessä. Eli tässä tapauksessa md5. Tarkemmin sanottuna, se on md5crypt. Pistin hashin windows koneelleni ja annoin hashcatin crackata, lopputulos:

Tuossa näkyy myös komento mitä käytin. Hashcat siis sanoo crackanneensa hashin, tarkistetaan output tiedosto:

Oikein meni. Tämä on hyvin käytännöllinen tapa millä voimme kerätä salasanoja käyttöjärjestelmästä jonka olemme kompromisoineet.

d) Etsi Mirai-haittaohjelman lähdekoodista kohta, josta ilmenee käytetty hyökkäys. Selitä, miten hyökkäys toimii. Mistä muista lähteistä löytyy tietoa Miraista? Onko samoja tekniikoita käytetty muissa hyökkäyksissä tai haittaohjelmissa?

Mirain lähdekoodi löytyy githubista täältä: https://github.com/jgamblin/Mirai-Source-Code (Lähde 8). Tämä tehtävä on itselleni haastava, sillä en ole kauhean hyvä koodin lukemisessa, ja osaan ohjelmoinnista vaan täysin perusteet. Tai no, olen tehnyt oman botin ennen pythonilla, mutta en silti sanoisi että koodausosaamiseni menisi alkeellisen tason yli.

Aivan rehellisesti sanottuna koodin lukeminen oli erittäin haastavaa sillä tiedostoja oli useita, ne vaikuttivat tekevän hyvin samanlaisia asioita, ja koodi oli aika sotkuista niin että en saanut selville mitä se oikein tekee (koodia ei oltu väsätty mitenkään simppelisti). Onnistuin kuitenkin löytämään tämän käyttäjätunnus/salasanalistan:

Tiedän että mirai oli bottinetti joka hyökkäsi IoT laitteita kohtaan, ja uskon että näitä salasanoja yritetään käyttää löydettyjen IoT laitteiden sisälle kirjautumiseen (vaikuttavat olevan joko default salasanoja/todella heikkoja). En löytänyt koodista oikeastaan mitään muuta hyödyllistä, joten menisin väittämään että tuo on miten tämä botti toimii (eli etsii ensin IoT laitteita, ja sitten yrittää kirjautua niihin näillä salasanoilla).

Menin katsomaan wikipediasta lisää tietoa koska tämän jälkeen jäin aikalailla jumiin ja funktioiden tuijottaminen ei oikein vienyt minua pidemmälle. Wikipedia linkki lähteissä (Lähde 9).

Wikipediassa on mainittu että tämä botti skannaa jatkuvasti internettiä lukuunottamatta tiettyjä IP-osoitteita kuten vaikka yhdysvaltojen department of defensen käyttämiä, varmaan eivät halua ongelmiin isojen valtioiden kanssa. Tämän jälkeen mirai yrittää kirjautua näihin laitteisiin default käyttäjätunnuksilla ja salasanoilla (kuten luulinkin) ja sen jälkeen infektoitunut laite jatkaa tämän prosessin tekemistä, eli internetin skannaamista ja uusien laitteiden liittämistä botnettiin.

Toisia samanlaisia botnettejä/malwareita ovat esimerkiksi “Bashlite”, “Gafgyt”, “Gbot” ja “Remaiten”. Ne ovat itseasiassa Mirain edeltäjiä. Lähde tähän täällä: https://krebsonsecurity.com/2017/01/who-is-anna-senpai-the-mirai-worm-author/ (Lähde 10). Samassa artikkelissa myös käydään läpi investigaatio siihen, kuka Mirain takana on (ja artikkelin kirjoittaja oli myös oikeassa Mirain kehittäjästä).

e) Kokeile jotain uutta salasanojen murtamiseen tai keräämiseen tarkoitettua ohjelmaa, jota ei ole opetettu tunnilla tai käytetty vielä läksyissä. Voit katsoa vinkkejä esimerkiksi infosecn1nja:n tai 0xdf:n artikkeleista linkeistä.

En oikeen löytänyt mitään fiksuja ohjelmia, mutta päätin lopulta kokeilla sellaista ohjelmaa kuin medusa. Man pagen luettuani vaikutti siltä että tällä pystyy brute forcettamaan web logineja kuten vaikka ssh, telnet, mysql, ftp. Päätin käyttää tässä testissä kali linuxia hyökkääjäkoneena ja metasploitable 2 laitetta kohteena.

Tein metasploitable 2 uuden käyttäjän nimeltä monkey salasanalla password123, ja laitoin meduusan crackkaamaan tätä:

medusa -h 192.168.56.101 -u monkey -P /usr/share/wordlists/rockyou/rockyou.txt -M ssh -O medusabruteforce/telnet2_crack.txt -t 100

-u on käyttäjätunnus jota käytetään, -P spesifioi salasanalistan, -M on mitä moduulia käytetään (tässä tilanteessa ssh), -O on output file, ja -t on kuinka monta yritystä per sekuntti. Huomio että 100 yritystä per sekuntti ei onnistu ssh, mutta se rajoittaa sen siihen maksimiin silti.

Medusa ehtii käydä noin 1300 salasanaa läpi ennenkuin se pysähtyy. En ollut varma löysikö se salasanan vai lopettiko se, joten menin katsomaan output filen:

Ihan hirveän vaikeampaa salasanaa en viitti antaa näille testiaccounteille, eihän se mitään muuttaisi paitsi sitä että ohjelma saisi juosta taustalla sen päivän (ja ssh brute forceeminen on hidasta!). Aika simppeli työkalu käyttää, vaikka onhan olemassa tietysti voimakkaampiakin työkaluja kuten hydra. Mutta tämä on erittäin simppeli työkalu ottaa käyttöön. Tässä ei tarvinnut erikseen spesifioida porttia, vaan annoimme vaan moduleksi palvelun nimen. Porttia pystyy kuitenkin muuttamaan myös mikäli palvelu on jollain muulla portilla kuin default mitä ohjelma käyttää.

Pari hyödyllistä komentoa medusan oppimiseen:

man medusa
medusa -help
medusa -d

medusa -d printtaa kaikki moduulit mitä meduusalla on. Kokeilin tätä myös metasploitable 2 mysql loginia vastaan, ainut ikävä juttu on siinä että metasploitable 2 root login on ilman salasanaa: ehdin ennen tämän tajuamista kokeilla jo 3 miljoonaa salasanaa :). Tässä komento mitä käytin siinä:

medusa -h 192.168.56.101 -u mysql -P /usr/share/wordlists/rockyou/rockyou.txt -M mysql -O medusabruteforce/telnet2_crack.txt -t 100

Myös usernamen selvittämiseen voi käyttää listaa, mutta siihen tulee sitten menemään erityisen pitkä aika. Omalla rockyou.txt tiedostossa on ainakin noin 14.3 miljoonaa salasanaa, joten ihan hirveän montaa käyttäjää et halua käydä läpi noin usealla salasanalla.

f) Ratko WebGoatin tehtäviä niin, että olet ratkaissut yhteensä 25-30 tehtävää.

Olen laskujeni mukaan tehnyt 21 tehtävää tähän mennessä, joten ratkotaan ainakin 4 lisää. Aloitan kohdasta Injection flaws: command injection.

Sain mitmproxyn toimimaan tätä tehtävää varten, mutta oli vaikeaa löytää resursseja siitä, miten ohjelma toimii ja miten saisin requesteja muokattua. Pitkän googlailun jälkeen tajusin kuitenkin että tässä pitää ensin interceptata requesteja ja sitten muokata niitä ja tämän jälkeen päästää ne menemään. Mitään yhtä lähdettä en voi tähän laittaa, sillä tämä oli vaan pitkän pähkäilyn lopputulos kun viimeinkin jokin naksahti päässäni.

No, kokeillaan. Minulla on nyt mitmproxy auki ja laitan sieltä interceptin tällä filterillä:

Eli nappaamme kaikki localhostista tulevat paketit. Hyvä muistaa että webgoat toimii localhostilla, ainakin tässä meidän tapauksessa. Seuraavaksi mennään itse tehtävään:

´Tehtävässä voi siis katsoa eri sivuja tuon napin avulla. Pistetään intercept päälle ja kokeillaan vaihtaa tuota sivua ja painaa View:

Saimme tuon napattua mitmproxyssä. Punainen siis tarkoittaa että tätä ei olla vielä lähetetty eteenpäin, vaan se odottaa että teemme sille jotain/annamme sen mennä läpi. Pari hyvää komentoa muuten tähän väliin:

  • painamalla “i” pystyy laittamaan intercept filterin päälle
  • painamalla “a” pystyy päästämään tietyn interceptatun paketin läpi, “A” päästää kaikki läpi.
  • painamalla “e” kun tarkastelee jotain yksittäistä flowta pystyy sitä muokkaamaan, ja painamalla tab pystytään tallentamaan nämä muutokset.

Mennään tuohon napattuun post requestiin ja katsotaan miltä siellä näyttää:

Tältä siis näyttää meidän POST request. Painetaan e ja muokataan sitä hieman (käytin tässä webgoatin “show solution” apuna, lähinnä mitmproxyn käyttämisen oppimista vielä).

Muokkasin hieman tuota formia, eli yritämme tässä backdoors.help lisäksi saada komentoa ipconfig pyörimään serverillä. Päästetään tämä eteenpäin ja katsotaan mitä tapahtuu:

Saimme kannustusviestin webgoatissa että olemme oikeilla jäljillä. Tehdään sama uudestaan, mutta tällä kertaa muokataan formia näin: “&netstat -a & ipconfig. Tulikin tässä kohtaa mieleen että intercept filterinä localhost on vähän liikaa, joten muokkasin sitä näin:

Nyt sen pitäisi napata vain tuo tietty post request. En kuitenkaan saanut tätä tehtävää toimimaan oikeastaan mitenkään, ja googlasin ja löysin tämän threadin: https://github.com/WebGoat/WebGoat/issues/179 (Lähde 11) jossa oli samaa ongelmaa mietitty. En nyt keksinyt tästä oikein mitään, joten käytin siellä esitettyä ” ; whoami # injectiota ja pääsin kohdasta läpi. 22 tehty.

Tässä kohdassa en selitä ihan yhtä tarkasti miten käytin mitmproxyä, samat asiat pätee aiemmasta kohdasta. Tässä tehtävässä pitää saada tehtyä SQL injektio niin, että se antaa meille dataa kaikista weather_stationeista eikä pelkästään yhdestä. Tässä miltä sql stringi näyttää:

Mitä tein oli että interceptasin tuon mitmproxyllä, ja laitoin seuraavan kyseiseen requestiin:

Päästetään tämä läpi ja katsotaan mitä tapahtuu.

Pääsimme kohdasta läpi, joten tuo on 23 tehty.

Kohta log spoofing oli sen verran hankala, että katoin neuvoa. Näköjään siinä on tarkoitus saada kirjautuessa uudelle linelle kirjoitettua “admin has succeeded in logging in”. Newline syntaksti oli vain todella kummallinen, kokeilin ensin itse /n joka yleensä toimii. Tämä oli lopulta ratkaisu:

Testi%0d%0aLogin succeeded for username: admin

Seuraava kohta on XPATH injection.

En ole ikinä tehnyt mitään XML injektioita, joten googlasin ensin miten tämmöinen kannataa suorittaa. Löysin tämän: https://owasp.org/www-community/attacks/XPATH_Injection (Lähde 12). Tuolla nopsaan lukien pistin login formiin tälläisen:

Pistin tuosta vain submit ja katsoin mitä tapahtuu:

Pääsimme kohdasta läpi tuolla, eli ei mikään erityisen haastava tehtävä ja erittäin samanlainen kuin nuo sql injektiot. 25 tehty.

Kohta String SQL injection

Tehtävä näytti tältä:

Eli tavoitteena saada kaikkien ihmisten luottokorttitiedot näkyviin, ei pelkästään vaikka smithin. Lähin kokeilemaan tätä kannalta ‘ OR 1=1, mutta ei toiminut. Googlasin tämän kaltaisen sql injection, ja löysin tämän: https://www.w3schools.com/sql/sql_injection.asp (Lähde 13). Siellä sanotaan, että “”=”” on aina totta. No, kostrutkoin oman:

' OR ''=' . 

Kun laitamme tuon ‘ ja sen jälkeen OR, näyttää se tältä: ” OR ‘. Nyt meidän pitää vain laittaa tuo meidän ”=” siihen mukaan ja meidän pitäisi saada kaikkien tiedot. Huom, että = tarvitsee vain yhden ‘ koska se toinen heittomerkki tulee perään vielä automaattisesti. Katsotaan mitä tapahtuu:

Luottokorttitiedot ovat nyt meidän. 26 kohtaa tehty, ja jätän tämän tältä osaa tähän.

Lähteet:

Lähde 1: https://hashes.org/left.php

Lähde 2: https://passlib.readthedocs.io/en/stable/lib/passlib.hash.md5_crypt.html

Lähde 3: https://hashes.org/hashlists.php

Lähde 4: https://hashcat.net/hashcat/

Lähde 5: https://www.md5hashgenerator.com/

Lähde 6: http://www.adeptus-mechanicus.com/codex/hashpass/hashpass.php

Lähde 7: https://linuxconfig.org/ssh-password-testing-with-hydra-on-kali-linux

Lähde 8: https://github.com/jgamblin/Mirai-Source-Code

Lähde 9: https://en.wikipedia.org/wiki/Mirai_(malware)

Lähde 10: https://krebsonsecurity.com/2017/01/who-is-anna-senpai-the-mirai-worm-author/

Lähde 11: https://github.com/WebGoat/WebGoat/issues/179

Lähde 12: https://owasp.org/www-community/attacks/XPATH_Injection

Lähde 13: https://www.w3schools.com/sql/sql_injection.asp

Palvelintenhallinta läksyt viikko 6 – Caius Juvonen

Tämän viikon läksyt ovat osa Tero Karvisen palvelintenhallintakurssia, jonka kurssisivu löytyy täältä läksyjen kera: http://terokarvinen.com/2020/configuration-managment-systems-palvelinten-hallinta-ict4tn022-spring-2020/ . Sama linkki myös lopussa.

a) Asenna jokin toinen Linux-levityspaketti orjaksi Saltille. CentOS on hyvä vaihtoehto. Voit esimerkiksi asentaa CentOS:n VirtualBoxiin ja tehdä koneiden välille virtuaaliverkon. Jos käytät Vagrantia, ‘cent.vm.box = “centos/7″‘ on kätevä.

Menin tuolla suositetulla CentOsilla. Ensin meidän tarvitsee mennä etsimään latauslinkki ja sitten asentaa se virtualboxiin laitteeksi. Olen myös kuvaillut tässä tehtävässä asennusta. Latauslinkki löytyy täältä (Lähde 1).

Kun olemme ladanneet .iso tiedoston, menemme virtulaboxiin ja lisäämme uuden laitteen. Eli, click new. Seuraavassa galleriassa on parit kuvat asennusprosessista.

Eli siis ensin valitsemme käyttöjärjestelmäksi Centos, sen jälkeen päätämme muistin määrän (itse tykkään tuosta 4096MB ram muistinmäärästä), pari hard disk asetusta ja ihan viimeiseksi hard diskin tila. Ei tähän tarvitse tuota 8GB enempää. Noissa kuvissa siis omat asetukseni.

Sitten ei tarvitse mitään muuta kuin käynnistää tämä uusi virtuaalikone ja valita oikea .iso tiedosto (eli se jonka juuri latasimme).

Tuon jälkeen painamme vain start ja järjestelmän pitäisi olla ready to go. Asennuksen aikana tapasimme pienen ongelman:

Eli tarvitsemme itseasiassa enemmän kuin 8 GB tilaa. No, loin vain uuden virtuaalikoneen samalla tavalla kuin aiemmassa kohdassa mutta tällä kertaa lisäsin 20 GB levytilaa. Ehkä hieman overkill, mutta koneellani on paljon levytilaa, joten ei se haittaakkaan. Pari muutakin asetusta mitkä halusin asettaa kunnolla itse käyttöjärjestelmän asennuksen yhteydessä, tässä kuva niistä:

Muutin defaulteista vain time&date suomen ajaksi ja keyboard layoutin suomalaiseksi myös, sekä muutin software selectionin workstationiksi (default oli server GUI). Kaikki nuo muut asetukset olivat default asetuksia. Tuon jälkeen vain painamme “Begin Installation” nappia ja asennus alkaa. Luomme myös käyttäjän ja asetamme root salasanan.

Nyt voimme finishata asennuksen. Pienimuotoinen ongelma: centos yrittää asentaa asennuksen jälkeen itseään uudestaan, jota emme tietysti halua. Olin hetken jumissa tässä kohtaa, mutta pystyin googlaamaan vastauksen, ja löysin artikkelin jossa mainittiin sama ongelma (Lähde 2). Meidän pitää unmountata installation diski, ja resetoida virtuaalikone. Lähteessä tarkemmat ohjeet.

Tämän jälkeen kone lähti toimimaan, ja pääsin kirjautumaankin heti kun olin hyväksynyt lisenssin. Halusin myös tälle koneelle guest additions, mutta se ei ollut aivan yhtä helppoa kuin mitä olin ajatellut. Käytin taas erästä toista artikkelia lähteenä sen tekemisessä (Lähde 3). Näitä komentoja ei kuitenkaan pystynyt tekemään ilman root-oikeuksia, joten lisäsin myös peruskäyttäjäni sudoers listaan, joka ei myöskään ollut yhtä helppoa kuin mitä luulin. Käytin siihen tätä lähdettä (lähde 4).

Ainut mitä tuosta artikkelista kuitenkin tein, olivat kyseiset komennot:

su
usermod -aG wheel Caius

Tuossa vain siis menimme ensin root käyttäjälle komennolla su, ja sen jälkeen lisäsin peruskäyttäjän ryhmään “wheel” jolla on sudo-oikeudet defaulttina. Tämän jälkeen pystyimme käyttämään sudoa peruskäyttäjällä.

Seuraavaksi käytin tuota lähde 3 eli guest additions ohjetta. Käytin kyseisiä komentoja:

sudo dnf install epel-release

sudo install dkms kernel-devel kernel-headers gcc make bzip2 perl elfutils-libelf-devel

sudo dnf update kernel-*

Tämän jälkeen laitteelle reboot. Rebootin jälkeen tarkistetaan että versiot ovat oikein:

Hyvältä näyttää, eli matchaavat. Lopuksi mennään virtualboxissa devices -> insert guest additions CD image -> run. Nyt pitäisi toimia, ja meillä on full screen centos käytössä.

Ensinnäkin asennetaan salt-orja koneelle jotta saamme sen osaksi orjiamme. Käytin tähän lähdettä 5, eli saltstackin omaa ohjetta. Tarvittavat komennot ovat tässä:

sudo yum install https://repo.saltstack.com/py3/redhat/salt-py3-repo-latest.el8.noarch.rpm

sudo yum clean expire-cache

sudo yum install salt-minion -y 

Tämän jälkeen meidän tarvitsee vain yhdistää tämä orja mestariin. Muokataan tiedostoa /etc/salt/minion ja lisätään sinne seuraavat linet (tai tarkemminkin, otetaan # pois):

master: 10.0.2.5
id: centos_orja

Tallenettuani nämä muutokset suljin ja uudelleenkäynnistin virtuaalikoneen, sillä tämä virtuaalikone ei myöskään ole oikeassa verkossa.

Kaikki muut koneet ovat tuossa natnetworkissa, joten lisäsin myös tämän siihen (muutenhan minioni ei voi yhdistää mestariin!). Tämän jälkeen uudelleenkäynnistys ja katsotaan mikä tilanne on mestarilla:

Eli centos orjamme haluaa nyt liittyä mukaan. Voimme liittää sen komennolla “sudo salt-key -A” joka hyväksyy kaikki unaccepted avaimet.

Vielä varmistus:

Centos_orja on nyt liitetty osaksi orjaverkkoamme.

b) Kerää grains.items avulla tiedot orjista, joissa on eri levityspaketti.

Meidän ainut eri levityspaketin orja on tuo juuri lisätty centos_orja, joten tehdään tämä komennolla

sudo salt 'centos_orja' grains.items

Tuolla saamme siis juuri kyseiseltä orjalta kysyttyä sen grains.items. Saamme pitkän listan eri asioita, mutta tässä kuvakaappaus muutamasta:

grains.items siis meille tiedottaa ihan oikein että kyseessä on redhat systeemi, ja että centos on kyseessä. Saimme siis paljon muutakin tietoa, mutta sitä ei voi kaikkea laittaa yhteen kuvakaappaukseen ja eipä se muutenkaan mitenkään erityisen mielenkiintoista olisi.

c) Tee päivän viesti (motd), jossa koneen tyyppi tulee grains osfinger -muuttujasta. Kokeile, että saat eri levityspaketeilla eri tuloksen. Voit hyödyntää aiemmin tekemääsi motd:ia.

Olen tehnyt tilan joka tekee jo tämän pyydetyn asian, joten tulen käyttämään sitä tämän tehtävän kanssa. Kyseinen tila luotiin viime viikon läksyissä, linkki tässä (Lähde 6). Siitä kuitenkin puuttuu osfinger, joten lisään sen nopeasti:

Kirjoitin sen siis tuohon viimeiselle linelle. Save ja exit, ja seuraavaksi lisäämme tämän tilan tuolle uudelle centos orjallemme.

Tuollaiselta meidän top.sls tiedosto siis nyt näyttää. Etäorjalla on eniten noita tiloja, mutta emme tarvitse mitään muuta tälle centos_orjalle paitsi motd_tehtävä:n. Save&exit, ja laitetaan tila päälle. Tämä onnistuu komennolla

sudo salt '*' state.apply

Vaikuttaa toimivan. Kokeillaan yhdistää komennolla “ssh Caius@10.0.2.4“.

Näyttäisi toimivan tahdotusti, ainakin tuossa lukee CentOS linux-8 :). Jos haluamme vielä varmistaa että siinä lukee jotain muuta, yhdistetään meidän toiselle orjalle.

Vaikuttaisi toimivan ihan tahdotusti. Saimme siis motd viestiin onnistuneesti laitettua tuon osfinger tiedon.

d) Tee tila, joka tekee RedHat-perheellä (esim. CentOS) tiedoston /tmp/redhat ja Debian-perheellä (esim Ubuntu) tiedoston /tmp/debian. Voit käyttää mitä vain eri perheiden levityspaketteja.

Tässä tehtävässä pitää siis kokeilla muotteja eri levityspakettien avulla. Unohdin miten koodia generoitiin, joten katsoin ohjetta täältä (Lähde 7), eli otan tuosta mallia. Aloitetaan sillä että luon uuden kansion mestarille /srv/salt ja luon sinne init.sls tiedoston. Tältä oma init.sls tiedostoni näyttää:

Tuossa siis if lausekkeen avulla olemme tehneet niin että mikäli grains[‘os’] palauttaa CentOS niin teemme tiedoston /tmp/redhat ja jos jotain muuta niin teemme tiedoston /tmp/debian. Itse testitiedosto on myös aika simppeli.

Siinä on turhaa tekstiä ja sitten se kertoo mikä käyttöjärjestelmä koneella on. Tämä ihan selvennyksen vuoksi, siis. Seuraavaksi lisätään tila vain kahdelle orjallemme ja laitetaan state.apply. Tältä näyttää top.sls:

Uudet muutokset merkitty nuolilla. Sitten vain tuttu “sudo salt ‘*’ state.apply” ja katsotaan toimiiko.

Ei ainakaan tässä kohtaa mitään ongelmia. Tarkistetaan tilanne itse koneilta:

Kaikki toimii niinkuin pitää, eli käyttöjärjestelmästä riippuen tiedoston nimi muuttui, ja voimme tekstistäkin päätellä mitkä käyttöjärjestelmät ovat kyseessä.

e) Tee tila, joka asentaa ja konfiguroi Apachen kahteen erilaiseen järjestelmään, esim. CentOS ja Ubuntu. Paketin nimi on CentOS:ssa “httpd”. Käytä Salt-koodin generointia muoteilla.

Lähestyn tätä tehtävää hyvin samanlaisella tavalla kuin aiempaa, eli generoimme koodia init.sls tilassa ja saamme sen avulla kaksi eri tulosta käyttöjärjestelmästä riippuen. Katsotaan miltä init.sls näyttää tällä kertaa:

Aika samanlainen kuin viime kohdassa. Hieman olen muuttanut, sillä emme tee samaa asiaa tällä kertaa, vaikka tässä onkin sama idea. Eli jos kyseessä on CentOS niin se asentaa httpd paketin, ja jos kyseessä on jotain muuta, se asentaa apache2-paketin. Top.sls tiedosto:

Taas merkitsin mitä lisäsin. Nyt vain “sudo salt ‘*’ state.apply“. Toivotaan että kaikki menee hyvin!

Ei virheitä, mutta mennään vielä tarkistamaan kummallakin koneella että oikeat jutut on asennettu. Mennään ensin centos masiinalle ja pistetään httpd päälle:

Ei virheitä, entäs miltä localhost näyttää?

Vaikuttaa toimivalta, eli centos pystyimme ainakin asentamaan apache webserverin onnistuneesti. Käydään vielä katsomassa ubuntulaite. Ei virheitä apache2 käynnistyksessä, joka on hyvä:

Entäs localhost?

Hups, olen tainut jättää default webpagen hieman erilaiseksi aiemmasta tehtävästä… No, ei se haittaa, tarkistetaan apache2 komennolla “sudo systemctl status apache2“.

On päällä ja asennettuna, eli toimii tahdotusti. Olemme nyt pystyneet asentamaan kaksi eri pakettia käyttöjärjestelmästä riippuen orjilemme.

Konfiguroin tätä vielä hieman niin, että default web-page muuttuu järjestelmän perusteella. Lisätään tämä init.sls tiedostoon:

Muutokset merkitty punaisella. Meidän webbisivu siis muuttuu käyttöjärjestelmän perusteella. Tehdään vielä nuo tarvittavat muottitiedostot:

Kaksi aika erittäin simppeliä nettisivua siis, niillä ei pitäisi olla mitään paitsi tuo yksi lause. Tehdään state.apply.

Saimme näköjään virheen. En ole täysin varma mikä virhe tuo on, mutta kokeilen tätä:

Tein siis kaksi if statementtiä yhden sijaan. Katsotaan muuttiko tämä mitään.

Ei muuttanut, saimme silti saman virheen. Tuo whitespace ongelma ei liity tähän, vaan tuo on typo jonka onnistuin tekemään tuossa samalla. Mutta sitten huomasin että meillähän on kyseessä vain simppeli virhe tiedostossa, nimittäin file.managed: alla ei lue oikein – source: salt:// vaan pelkkä salt://. Korjataan virhe:

Kokeilin samalla tuota ensimmäistä versiota, koska se oli mielestäni paljon siistimpi. State.apply ja kaikki toimii. Tarkistetaan ovatko sivustot muuttuneet:

Ääkköset eivät toimi ubuntulla, mutta kaikki muu kyllä, eli saimme eri käyttöjärjestelmille eli default webbisivut.

Lähteet:

Lähde 1: http://isoredirect.centos.org/centos/8/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso

Lähde 2: https://linuxhint.com/install_centos8_virtualbox/

Lähde 3: https://kifarunix.com/install-virtualbox-guest-additions-on-centos-8/

Lähde 4: https://www.rosehosting.com/blog/how-to-create-a-sudo-user-on-centos-7/

Lähde 5: https://repo.saltstack.com/#rhel

Lähde 6: https://caiusinfo.data.blog/2020/05/05/palvelintenhallinta-laksyt-viikko-5-caius-juvonen/

Lähde 7: http://terokarvinen.com/2018/configure-windows-and-linux-with-salt-jinja-if-else-and-grains

Palvelintenhallinta läksyt viikko 5 – Caius Juvonen

Tällä viikolla tehdään taas palvelintenhallintakurssin läksyjä. Läksyt on otettu täältä: http://terokarvinen.com/2020/configuration-managment-systems-palvelinten-hallinta-ict4tn022-spring-2020/. Ovat myös lähteenä lopussa.

a) Hello templates! Tee muotilla esimerkkitiedosto, jossa on muuttujien (esim grains) arvoja.

Yritän tässä kohtaa tehdä tiedoston joka saa grains tiedoista käyttöjärjestelmän koko nimen. Tarkistetaan ensin grains.items mikä sen nimi on:

osfullname, eli käytämme tuota tiedostossamme. Ymmärtääkseni sitä joutuu käyttämään grains[‘osfullname’] tyyppisesti, mutta en ole vielä täysin varma. Kohta tulemme tietämään kun kokeilemme toimiiko se 🙂

Ensinnäkin loin uuden kansion /srv/salt/templates_test/ . Tähän uuteen kansioon loin tiedoston init.sls. Ja sinne sisään pistin seuraavan:

/tmp/templates.txt:
  file.managed:
    - source: salt://templates_test.txt

Sen jälkeen muokkasin vielä top.sls tiedostoa ja pistin sinne orjille moduuliksi tämän uuden templates_test:in. Sitten vain “sudo salt ‘*’ state.apply“. Mutta sain outputiksi pelkästään

Tuossahan piti siis lukea “This OS is Ubuntu” mutta tuohon on pistetty vaan se meidän variable eikä sitä outputtia. Mietin tätä jonkin aikaa, ja tajusin että tämä tiedosto on pelkkä tekstitiedosto eikä jinjaa, eihän tämä muuten toimi. Joten menin pistämään /srv/salt/templates_test/init.sls tämmöisen muutoksen:

/tmp/templates.txt:
  file.managed:
    - source: salt://templates_test.txt
    - template: jinja

Tuossa siis alleviivattuna uusin muutos. Pistin uudelleen state.apply ja katsoin mitä tapahtuu kun teen “cat /tmp/templates.txt“.

Nyt toimii niinkuin pitääkin, eli saimme toimimaan tuon variablen jolla saamme grains.items tietoa vaikka käyttöjärjestelmästä ja voimme käyttää näitä eri tietoja hyväksemme.

b) Message of the Day. Sisäänkirjautuessa näytetään päivän viesti. Lisää päivän viestiin tietoa ympäristöstä käyttäen muotteja. Sopiva tiedosto on /etc/motd.

Meidän pitää ensinnäkin luoda tämä tiedosto, ja sitten lisätä sinne tietoja. Lähdetään liikkeelle siitä että teemme uuden directoryn /srv/salt. Tämän directoryn nimeksi annan motd_tehtävä. Tälläiseltä näyttää meidän init.sls tiedosto:

/etc/motd:
  file.managed:
    - source: salt://motd_muotti
    - template: jinja
    - makedirs: True

Tuo makedirs kaitaa olla aika turha sillä kaikilla koneilla pitäisi olla /etc/, mutta lisäsin sen nyt silti ihan varmuudeksi, vaikka mielestäni file.managed jo varmistaa että kyseinen tiedosto luodaan. No, seuraavaksi meidän pitää vain tehdä tuo muottitiedosto ja sitten katsoa toimiiko.

Menin ensin katsomaan grains.items mitä tietoa haluamme tuohon motd tiedostoon pistää. Ensinnäkin halusin edelleen osfullname edellisestä kohdasta, mutta sen lisäksi löysin esimerkiksi osrelease joka kertoo meille sen hetkisen version, ja myös muistin määrän ja kuinka monta CPU:ta koneessa on.

Aloin työstämään muottitiedostoamme. Tässä lopputulos:

Welcome. The current OS is {{ grains['osfullname'] }} and it's version number is {{ grains['osfinger'] }}.
<br>
The current salt version is {{ grains['saltversion'] }}.
<br>
Memory: {{ grains['mem_total'] }}.
<br>
Number of CPU's: {{ grains['num_cpus'] }}. 

Tässä siis näkyy sen hetkinen käyttöjärjestelmä, sen versio, saltin versio, muistin määrä ja kuinka monta CPU:ta koneessa on. Tässä kohtaa kaikki mikä on jäljellä on kokeilla toimiiko tämä. Tallensin tiedoston ja menin lisäämään tämän etäorjalleni top.sls tiedoston kautta:

base:
  'etäorja':
    - motd_tehtävä

Tuossa ei tietenkään koko top.sls tiedosto, vaan ne tärkeimmät osat. Tehdään state.apply ja kokeillaan ssh yhteyttä tähän orjaan. Tosin, yksi ongelma. Meidän orjalla ei ole ssh serveriä. Lisätään se nyt vaikka tähän motd_tehtävä. Lisäsin init.sls tiedostoon

openssh-server:
  pkg.installed

Nyt vaan uudestaan state.apply että minionille asentuu tuo openssh serveri ja voimme oikeasti ottaa siihen yhteyden. Kokeillaan uudestaan “ssh papu@10.0.2.15“.

Jes, eli saamme yhteyden. Entäs motd-viesti?

Toimii, vaikka noi <br> olivat turhia. Hups. Poistetaan vaan ne ja hyvää jälkeä kuitenkin tulee. Lopputulos:

Hyvältä näyttää ja kaikki toimii toivotusti. Ehkä nuo pisteet voisi vielä poistaa ja MB lisätä tuohon muistin perään, mutta en dokumentoi sitä tähän kuitenkaan kun viesti varmaan meni jo perille 😉

c) Bash. Tee bashiin asetuksia Saltilla. Ensin käsin, vasta toimivaa automatisoidaan. Muista testata lopputulos käyttäjän näkökulmasta.

En tietänyt miten bashin asetuksia voidaan muokata, joten googlasin ja löysin neuvon siihen liittyen (Lähde 1). Siellä lukee että meidän pitää muokata tiedostoa ~/.bashrc, joka siis sijaitsee käyttäjän home directoryssä.

Tein uuden kansion /srv/salt:iin ja sinne sisälle init.sls tiedoston. Init.sls näyttää tältä:

/home/caius/.bashrc:
  file.managed:
    - source: salt://bash_muotti

Emme tee tuota muottitiedostoa alusta lähtien, vaan kopioin sen ensin omasta home directorystäni ja sitten teen muutokset sen tiedoston loppuun. Mennään siis /home/caius ja kopioidaan .bashrc tiedosto /srv/salt:

sudo cp .bashrc /srv/salt

Näin saadaan kopioitua tiedosto tuonne oikeaan kansioon missä voimme muokata sitä niin että saamme siitä muottitiedoston. Tämä tiedosto on myös hidden by default, eli muokataan vielä sen nimeä

sudo mv .bashrc bash_muotti

Nyt muottitiedoston nimi on bash_muotti, ja poistimme myös pisteen . tiedoston edestä (piste tiedoston edessä piilottaa tiedoston). Sitten vielä viimeinen asia ennenkuin tämä on valmis, haluamme lisätä tämän bash muottitiedoston perään linen

PS1="caiustesti> "

Käsittääkseni tämän on tarkoitus muokata bashissa nimi tuohon caiustestiin. Kokeilen tätä nyt vielä paikallisesti ensin niin että lisään tämän muutoksen top.sls tiedostossa vain paikalliselle koneelleni. Nyt voidaan pistää state apply ja katsotaan toimiiko. Avataan uusi cmd terminaali ja tadaa:

Sanoisin että lopputulos on huomattavasti rumempi, mutta saimme sen silti toimimaan. Tässä kohtaa kaikki mitä meidän täytyy tehdä on vain lisätä tämä muille orjille. Voimme tehdä tämän helposti samalla tavalla kuin teimme tämän, meidän pitää vain muokata /home/caius/.bashrc polku orjille sopivaksi, kuten /home/papu/.bashrc. Voimme itseasiassa lisätä sen vain samaan bash init.sls tiedostoon, sillä pelkkä file.managed ei tee kansioita vaan tarkistaa vaan että onko kyseistä tiedostoa olemassa ja luo sen mikäli ei (mutta tässä tilanteessa polku erilainen, joten se ei luo sitä meille kahteen kertaan, huom makedirs ei ole päällä).

/home/caius/.bashrc:
  file.managed:
    - source: salt://bash_muotti

/home/papu/.bashrc:
  file.managed:
    - source: salt://bash_muotti

Koska orjakoneella ei ole /home/caius ei tuo ylempi tee mitään orjalla ja vice versa. Edellään olisi kiva jos olisi joku tapa viitata aina kyseisen käyttäjän kotihakemistoon automaattisesti, mutta en ole vielä keksinyt siihen mitään 🙂

d) Nginx. Tee nginx-weppipalvelimeen asetuksia Saltilla. Voit esimerkiksi tehdä uuden site:n, niin että etusivu vaihtuu. Kun nginx on todennäköisesti sinulle uusi palvelin, tässä tehtävässä on siis ensin laaja osuus valita sopiva asetus nginx:lle ja saada se toimimaan käsin. Vasta toimivaa, käsin kokeiltua kannattaa automatisoida. Muista lopputuloksen testaus käyttäjän näkökulmasta.

Asennetaan ensin käsin.

sudo apt-get update
sudo apt-get install nginx -y
service nginx start

Näillä päästään alkuun. Voimme tarkistaa onko nginx päällä komennolla service nginx status, ja voimme myös käydä tietysti localhostissa sillä siellähän sen pitäisi pyöriä.

Hyvin näyttäisi toimivan. Tässä kohtaa loppui mielikuvitus kesken ja päätin vaan vaihtaa tämän default pagen. Ensinnäkin meidän pitää tietää mikä tämä tiedosto on ja sitten yrittää muuttaa sitä. Tutkitaan dokumentaatiosta. Käytin tähän kohtaan Lähdettä 2.

Lähteen mukaan default page sijaitsee /var/www/html. Käydään katsomassa:

Siellähän se näyttäisi olevan. Kun vielä tarkastelemme tätä html tiedostoa varmistuaksemme, huomaamme koodista että ihan sama html sivu on kyseessä:

Selvä, nyttenhän meidän ei tarvitse tehdä mitään paitsi muuttaa tuota default web pagea ja homma on siinä. Ensinnäkin muutin hankalan tiedostonimen pelkäksi index.html ja sitten menin tekstieditoriin ja poistin kaiken ja kirjoitin html sivun uusiksi.

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1> Tämä sivu on iso ja mahtava </h1>
<br>
<br>
<p> Tässä pientä tuherrusta </p>
</body>
</html>

Aika simppeli. Sivu itsessään näyttää siis tältä:

Ääkköset bugailee, mutta se nyt ei ole pointti. Olemme siis saaneet default pagen muutettua, nyt sama orjille. Meen nyt vielä tekemään /srv/salt nginx init.sls tiedoston ja kansion. Tältä näyttää init.sls tiedosto:

nginx:
  pkg.installed

/var/www/html/index.html:
  file.managed:
    - source: salt://nginx-index.html
    - makedirs: True

Sinänsä tämä nytten varmaan toimisikin, mutta tajusin toisen ongelman: tuon default web pagen nimi ei ole index.html. Helppo ratkaisu olisi uudelleenimetä tämä meidän index.html tuossa init.sls tiedostossa, mutta menemme vaikeamman kautta eli muokkaamme vielä yhtä tiedostoa. Tätä voi vaihtaa /etc/nginx/sites-available/default tiedostossa. Siellä on seuraava line:

Poistetaan vaan tuo viimeinen ja ei pitäisi olla ongelmia. Muistetaan lisätä tämä ohje init.sls salttiin:

/etc/nginx/sites-available/default:
  file.managed:
    - source: salt://nginx-config
    - makedirs: True

Muistetaan tosiaan kopioida tuo nykyinen sites-available/default tiedosto tuonne meidän /srv/salt kansioon. “sudo cp default /srv/salt/“. Lisätään vielä koko homma top.sls ja pistetään state.apply.

Muuten ihan hyvin paitsi olisi varmaan kannattanut myös tuo meidän muottitiedosto laittaa sinne mihin se kuului. Kopioin sen vielä nopeaan tuonne /srv/salt minne se kuuluukin aikaisempaa menetelmää noudattaen. Kokeillaan sen jälkeen nyt uudestaan.

Vaikutti toimivan. Senhän saa vielä selville kun mennään etäorjakoneelle ja katsotaan minkälainen webbisivu sieltä localhostista esiin tulee:

Tämä sivu on siis saatu minionille. Vaikuttaa siltä että kaikki meni suunnitellusti, ja voimme taputtaa itseämme olkapäälle. En tiedä missasinko tässä koko prosesissa jotain (en ymmärtääkseni) ja ainakin se toimii joten oletan että jotain meni oikein kuitenkin 🙂 .

Lähteet:

Läksyt täältä: http://terokarvinen.com/2020/configuration-managment-systems-palvelinten-hallinta-ict4tn022-spring-2020/

Lähde 1: https://www.ostechnix.com/hide-modify-usernamelocalhost-part-terminal/

Lähde 2: https://www.raspberrypi.org/documentation/remote-access/web-server/nginx.md

Tunkeutumistestaus läksyt viikko 5 – Caius Juvonen

Tällä viikolla teemme taas pentest kurssin läksyjä. Linkki läksyihin tässä: http://terokarvinen.com/2020/tunkeutumistestaus-kurssi-pentest-course-ict4tn027-3003/ ja myös postauksen lopussa.

a) Murtaudu Metasploitable 2 harjoitusmaaliin useilla tavoilla käyttäen Metasploit-hyökkäysohjelmaa. Voit käyttää apuna Exploitability Guidea.

Tein tätä tunnilla ja löysin kaksi eri tapaa murtautua metasploitable machineen. Molemmat hyödynsivät jo olemassa olevia backdooreja vanhoissa versioissa ohjelmia mitä metasploitable 2 käyttää.

Teen nyt saman uudelleen tässä. Ihan ensinnäkin, haluan käynnistää metasploitin. Luulisi että tämä on helppoa ja msfconsole kelpaa, mutta meidän pitää itseasiassa käynnistää monta eri serviceä samaan aikaan. Olen tehnyt pienen skriptin käynnistystä varten:

Tässä skriptissä sii ensin käynnistetään postgresql joka on pakollista metasploitin käyttöä varten sillä metasploit käyttää tätä kyseistä ohjelmaa. ss -ant ei ole pakollinen, se listaa meille vain avoimia portteja, mutta lisäsin sen silti tuohon skriptiin. msfdb init käynnistää metasploit tietokannan, tämäkin on pakollinen osa skriptiä. Ja lopulta msfconsole on se komento millä itse metasploit ohjelman saa päälle, eli tämäkin tietysti pakollinen.

Nyt kun meillä on metasploit päällä, on varmaan aika tarkistaa että saammekö edes yhteyden kohteeseemme eli metasploitable 2 laitteeseen. Näiden molempien laitteiden pitäisi olla samassa lähiverkossa, mutta kummallakaan ei pitäisi olla esimerkiksi pääsyä internettiin (metasploitable 2 näkyvissä nettiin on huono idea, koska se on todella vulnerable laite).

Yllä olevissa kuvissa on tarkistettu että laitteet ovat samassa verkossa. Eli ifconfig molemmilla ja sitten kokeilin pingata toista laitetta, sillä mikäli se vastaa tarkoittaa se että olemme samassa verkossa. Nyt kun olemme varmistuneet kohteestamme, voimme siirtyä seuraavaan kohtaan.

Tässä kohtaa teemme port skannin kohdekonetta vastaan. On erittäin tärkeä varmistaa, että kohdistamme portskannin oikeaan koneeseen emmekä vahingossa johonkin muuhun tietokoneeseen joka on internetissä. Tällä hetkellä meillä ei kuitenkaan ole internet yhteyttä, ja olemme varmistaneet että nämä kaksi konetta saavat yhteyden vain toisiinsa. Kirjoitetaankin siis komento:

nmap -Pn -A -oA metasploitable_skan 192.168.56.101

Tämä komento versioskannaa (-A valinta) kohteen portit ja tallentaa tulokset metasploitable_skan nimisiin tiedostoihin (-oA <tiedosto_nimi> valinta). -Pn vain tarkoittaa että nmap kohtelee tätä hostia niin että se olettaa että se on päällä, eli skippaa target discoveryn.

Kun skanni on valmis, tutkitaanpa hieman tuloksia. En laita koko skannin tulosta tähän sillä se on liian iso tuloste, mutta laitan tähän muutaman mielenkiintoisen portin:

Satun jo etukäteen ennen tätä tehtävää tietämään, että nämä kaksi serviceä mitä näillä porteilla on ovat erittäin haavoittuvaisia, ja voimme niitä käyttämällä päästä helposti metasploitable 2 laitteeseen kiinni. Aloitetaan vsftpd 2.3.4. Tässä vsftpd:n versiossa on olemassa backdoor jolla saa suoran root accessin tietokoneeseen, ja metasploitissa on moduuli mitä voimme käyttää tämän backdoorin hyödyntämiseen.

Ensinnäkin, metasploitissa on tuhansia moduuleja, mutta niiden löytäminen ei ole erityisen vaikeaa. Kaikki, mitä meidän tarvitsee tehdä, on kirjoittaa:

search vsftpd

Tämä etsii meille kaikki vsftpd liittyvät moduulit. Löydämme vain yhden:

Tämä kyseinen moduuli on siis se mitä haimme. Kuten näemme, se toimii vsftpd:n versiossa 2.3.4, eli sama versio mitä tuossa metasploitable 2 laitteessa on. Voimme ottaa tämän exploitin käyttöön metasploitissa joko kirjoittamalla “use 0” tai “use exploit/unix/ftp/vsftpd/234_backdoor“. Use 0 toimii koska olimme aiemmin etsineet moduleita ja tuossa kuvassakin näkee että tälle moduulille on annettu numeroksi 0. Tämä on siis vain nopeampi tapa ottaa moduuli käyttöön.

Nyt kun meillä on oikea moduuli käytössä, meidän pitää vielä konfiguroida se oikein. “show options” (tai lyhyesti, pelkkä “options“)komento näyttää meille mitä meidän pitää konffata että saamme exploitin toimimaan kunnolla. Kokeillaan:

Meillä on 2 asetusta mitkä vaaditaan tämän exploitin toimimiseksi. RHOSTS ja RPORT. Kohdassa RHOSTS ei ole by default mitään, ja tämä on siis kohdekoneen IP. Kohdassa RPORT on valmiiksi port 21, sillä port 21 on se perusportti millä tämä vsftpd palvelu juoksee. Portti 21 on oikein, joten meidän pitää vain laittaa kohtaan RHOSTS kohteemme ip, eli 192.168.56.101. Voimme tehdä sen tällä komennolla:

set RHOSTS 192.168.56.101

Tämä siis asettaa oikean IP:n. Katsotaan asetukset uudestaan:

Kuten nyt näemme, kohtaan RHOSTS on ilmestynyt kohteemme ip. Nyt kaikki on valmista, ja meidän tarvitsee vain käynnistää hyökkäys. Tämän voi tehdä joko komennolla “run” tai “exploit“.

Hyökkäys onnistui. Saimme kohteeseen shell-yhteyden, ja meillä on käytössä root-oikeudet. Tämä on erittäin helppo tapa päästä metasploitable 2 laitteeseen sisälle.

Seuraavaksi toinen tapa joka on hyvin samnlainen tähän verrattuna. Voimme ensinnäkin terminoida nykyisen shell-yhteyden kohteeseen painamalla ctrl+c, ja valita uuden moduulin kirjoittamalla ensin “back” (ei pakollinen) ja sitten tekemällä saman kuin aiemmin, eli etsitään ensin onko metasploitissa moduulia kyseiseen versioon. Kohteemme oli siis portti 6667 jossa palvelu UnrealIRCd juoksi. Tehdään “search unrealircd”.

Kuten aiemmin, löysimme backdoorin tähän laitteeseen. Käytämme nyt hyvin samanlaista tapaa kuin aiemmassa kohdassa, eli ensin “use 0“, sitten “show options” ja säädetään asetukset oikein.

Täysin samanlaiset asetukset kuin aiemmalla exploitilla, eli meidän tarvitsee vain kertoa kohteen IP ja portti. Porttikin on jo valmiiksi oikein. Asetetaan IP komennolla “set RHOSTS 192.168.56.101″. Nyt meidän pitää vain laukaista hyökkäys. Shellin löytämiseen menee hieman pidempään kuin aiemman exploitin kanssa, mutta löydämme sen silti:

Olemme siis taas saaneet root-accessin, ja emme oikeastaan tehneet mitään muuta kun näppäilleet kohteen IP:n kummassakin kohtaa. Käytimme molemmissa kohdissa backdooria, joten ajattelin keksiä vielä jotain erilaista. Exploitability guidessa sanottiin (Lähde 1) että sinne voi myös mennä helpompaa reittiä. Pelkästään komento

telnet 192.168.56.101 1524 

riittää. Ja tämän avulla saamme vielä kaiken lisäksi terminal root accessin. Tämä sen takia että portilla 1524 on vanha backdoor nimeltä “ingreslock”, ja saamme rootin välittömästi sen avulla. En oikeastaan keksinyt mitään muuta tapaa päästä boxiin sisälle suoranaisesti, tiedän että metasploitable 2 pyörittää myös vulnerable web-serveriä, mutta en ole varma miten pääsisin niillä eteenpäin koska en ole niin kokenut web applikaatio hackingissä.

b) Kokeile eri asioita, mitä pystyt tekemään koneella, jonne olet päässyt Metasploitilla.

Jos mietitään mitä pystyn tekemään tuolla terminal root yhteydellä, niin oikeastaan mitä vaan. Mutta jos mietitään mihin tuota shell roottia voi käyttää, niin tutkitaan. Pystymme:

  • Navigoimaan järjestelmässä
  • Listaamaan tiedostoja (ls komento)
  • Tekemään uusia kansioita minne haluamme (mkdir)
  • Tekemään uusia käyttäjiä rootin oikeuksilla (adduser, uid=0)
  • Poistamaan tiedostoja tai kansioita
  • Lukemaan tärkeitä tiedostoja, kuten vaikka /etc/shadow

Kysymys alkaakin olemaan, mitä me emme pysty tekemään? Pelkällä shell accessilla on vaikea tehdä uusi tiedosto catin avulla tyyliin “cat > testi.txt“. Tämä siksi, että sen jälkeen tiedostoon pitää kirjoittaa myös jotain, ja kun on kirjoittanut mitä haluaa, catin voi exittaa painamalla ctrl+d. Ikävä kyllä, tämä funktionaalisuus ei toimi shell-yhteyden avulla, ja tähän jää itseasiassa jumiin. Tai, ehkä on olemassa tapa tehdä tämä, mutta itse en tiedä miten. Mutta kaikki nämä shell yhteyden ongelmat voi korjata niin että teemme vain uuden käyttäjän root oikeuksilla ja sitten otamme yhteyttä sillä käyttäjällä 😉 .

c) Lue O’Reilly Learning:sta Metasploittia käsittelevä artikkeli tai katso video. Kokeile kolmea kurssilla ja tässä tehtävässä aiemmin esittelemätöntä ominaisuutta tai tekniikkaa Metasploitista käytännössä. Pääset O’Reilly Learningiin HH tunnuksilla maksutta.

Käytin tässä tehtävässä kirjaa “Metasploit Penetration Testing Cookbook – Third Edition” (Lähde 2). Löysin sieltä kohdan jossa puhuttiin metasploitin TCP-port skannerista: En edes tiennyt, että metasploitilla on omakin port skannerinsa! Halusin tietysti heti kokeilla tätä. Kirjan mukaan metasploitissa on auxiliary/scanner/portscan moduuli, mutta tieto on hieman jälkeen jäänyttä, sillä tämä ei ole koko moduulin path, vaan loppuun pitää vielä kirjoittaa tcp. Eli “use auxiliary/scanner/portscan/tcp“. Katsotaan mitä asetuksia tälle moduulille on:

Itseäni ainakin kiinnostaa lähinnä tuo PORTS ja RHOSTS kohta. Laitetaan kohtaan PORTS 1-100 ja kohtaan RHOSTS kohdekoneen ip, eli 192.168.56.101. Voimme muuttaa näitä asetuksia samalla tavalla kuin aiemmin, eli “set <asetus> <value>“.

Vastauksen saimme nopeasti ja se näyttää meille avoimia portteja metasploitable 2 laitteella (vain tcp portteja). Se ei kuitenkaan kerro meille mitä palveluja portilla on eikä myöskään niiden versioita, eli ehkä nmappia heikompi työkalu ainakin näin nopeasti katsottuna, mutta silti mielenkiintoista että tässäkin on oma porttiskanneri mukana.

Luin myös kyseisestä kirjasta että metasploitissa on semmoinen ominaisuus jolla voi skannata http sivuja. Koska metasploitable 2 pyörittää myös web-serveriä, ajattelin että tämä on hyvä tilaisuus kokeilla kyseistä ominaisuutta. Kokeilen nyt sellaista ominaisuutta joka tutkii robots.txt tiedostoa.

Voimme käyttää tätä robots.txt tutkimisominaisuutta komennolla “use auxiliary/scanner/http/robots_txt“. jos kirjoitamme “options“, saamme seuraavat asetukset:

Tässä haluamme vaihtaa ainakin tuon RHOSTS oikeaksi eli 192.168.56.101 (kohteen IP). Sen lisäksi meidän pitää spesifioida PATH, eli mistä päin sivua etsimme sitä robots.txt tiedostoa. Koska kyseessä on metasploitable 2, laitamme pathiksi /mutillidae joka on yksi siellä oleva sivu. Se miten tuo tehdään on selitetty aiemmin jo tässä useasti, eli käytämme set komentoa. Katsotaan toimiiko/mitä tapahtuu:

Aijaa, haluamme että google ei löydä ./passwords/. Sehän olisi tietysti kovin ikävää 🙂 . Nopea selitys siitä, mitä robots.txt tekee: se kertoo hakukoneille mitä polkuja hakukone ei tule näyttämään sivua etsittäessä. Mennään nopeasti tutkimaan:

Tadaa, clear tekstinä käyttäjätunnukset ja salasanat, ei tarvitse edes hasheja alkaa murtamaan. Tietystihän kyseessä on erittäin vulnerable applikaatio ja oikeasti tälläisen löytäminen olisi jo onnekasta ja erittäin huolimatonta ylläpitäjältä, eihän kukaan järkipäinen laittaisi salasanatietoja internettiin clear tekstinä! Right?

Kokeilin vielä lopuksi sellaista ominaisuutta kuin SSH skanneri, joka tutkii mikä ssh versio palvelimella juoksee. Samantyyppinen kuin port scan, mutta antaa enemmän informaatiota. Voimme ottaa sen käyttöön komennolla “use auxiliary/scanner/ssh/ssh_version“. Options näyttää seuraavalta:

Tässä on hyvä huomata että olen jo valmiiksi asettanut RHOSTS IP:n oikein ja laittanut THREADS kohtaan 256. Sen jälkeen meidän tarvitsee pelkästään tehdä run ja nähdä mitä tapahtuu:

Tuosta saimme siis läjän informaatiota palvelimen ssh palvelusta. Voimme käyttää tätä jatkossa palvelimelle murtautumiseen mikäli jokin näistä tiedoista vaikuttaa siltä, että se auttaisi meitä murtautumaan palvelimelle tätä kautta.

Tässä on nyt esitelty 3 uutta metasploit ominaisuutta: port skan, robots.txt skan ja ssh skan.

c) Asenna jokin muu virtuaalikone harjoitusmaaliksi kuin Metasploitable 2. Murtaudu siihen Metasploitilla.

Ajattelin asentaa jonkin virtualboxin vulnhubista ja murtautua siihen. Kuulin paljon hyvää sellaisesta kuin mr.robot, ja päätin kokeilla kyseistä boxia (Lähde 3). Asentaminen oli harvinaisen simppeliä. Lataamme sivulta .ova tiedoston, ja sitten menemme virtualboxiin. File -> import appliance -> valitse .ova tiedosto -> import. Tämän jälkeen säädin vain connection asetukset niin että saimme tämän uuden VM samaan verkkoon.

Nyt sain tämän uuden vulnerable VM:n käynnistettyä, joten ensimmäinen asia jonka teen on suorittaa ping-scan lähiverkkoon jotta voin tietää missä IP-osoitteessa tämä uusi kohde on. nmap -sn 192.168.56.0-255. -sn tarkoittaa että tehdään pelkkä host discovery, eli ping scan. Katsotaan mitä tapahtuu:

Kolme hostia up. Näistä 101 ja 103 on metasploitable 2 ja kali linux, eli uusi kohde VM on ip-osoitteessa 192.168.56.104. Tallensin tämän IP:n nyt tekstitiedostoonkin ihan varmuuden vuoksi. Seuraavaksi meidän kannattaa tehdä nmap port skanni tälle uudelle laitteelle, ja katsoa mitä portteja siellä on auki. Käytän seuraavaa nmap skan komentoa:

nmap -Pn -A -oA portskan -p- 192.168.56.104

Tässä -Pn eli skip host discovery, vain port skan, -A tutki kaikki versiot ja järjestelmän OS, -oA kirjoita tiedot tiedostoihin nimeltä portskan ja -p- skannaa kaikki portit. Laitetaan skan pyörimään ja katsotaan mitä tapahtuu:

Eli meillä on oikeastaan vain webserveri auki. Kävin kyseisellä sivustolla ja se oli hieman kryptinen. Sitten muistin että /robots.txt tiedostossa voi olla monta mielenkiintoista eri asiaa, joten päätin katsoa sen seuraavaksi. Robots.txt sisälsi seuraavaa:

Tuossa siis ainakin ensimmäinen flagi mikä meidän piti löytää. Otin sen talteen ja tallensin sen nimellä first_key.txt. En ole varma mikä tuo fsocity.dic on. Menin katsomaan sitä, ja sain

No, päätin tallentaa tuon vaikka en ollut ihan varma mitä se on. Tiedoston avatessani huomasin että se vaikuttaisi olevan pekkä wordlist. En ollu täysin varma mitä tekisin seuraavaksi, joten päätin kokeilla ohjelmaa nimeltä nikto, sillä olen ennenkin käyttänyt sitä nettisivuja vastaan. Kokeillaan:

nikto -h 192.168.56.104

-h käytetään vain hostin tai siis kohteen spesifiointiin. Tässä kohtaa se on siis tuo uusi masiina jonka asensimme. Löysin nikto skannilla muutamat mielenkiintoiset sivut:

  • /readme
  • /admin
  • /wp-login

/readme ei ollut mielenkiintoinen, ja /admin jumitti koko selaimen. /wp-login kuitenkin antoi meille wordpress login pagen, jota voisimme varmaan käyttää. Ikävä kyllä tässä kohtaa omat taitoni loppuivat, luovutin ja katsoin walkthroughta tätä boxia varten (en ollut edes varma käytetäänkö tässä metasploit). Käytin erään toisen henkilön blogia tässä, linkki lähteissä (Lähde 4).

En olisi halunnut käyttää ulkopuolisia lähteitä, mutta ihan rehellisesti sanottuna minulla ei ole vielä oikeastaan mitään ideaa mitä tekisin tälläistä webbi sivua vastaan, osaan lähinnä tähän mennessä vain porttiskannailla ja etsiä sieltä jotain vanhentuneita versioita mitä pystyn hyväksikäyttämään. Tässä ei ollut sellaisia, joten omat temput loppuivat aika pian pussista, mutta tämä on silti mielestäni hyvää harjoittelua koska nyt tässä samalla opin esimerkkejä siitä, miten tässä tilanteessa kannattaisi edetä.

Näköjään olin ihan oikealla reitillä ainakin sen mukaan, että /robots.txt oli oikeasti tärkeä. Siellä oli siis ensimmäinen flagi kuten tiesimme, ja näköjään myös tuota toista tiedostoa oli tarkoitus käyttää (juurikin wordlistana). Siellä on yli 800k sanaa, mutta kuten blogissa todetaan, suurin osa on duplicateja. Voimme poistaa duplicatet komennolla

sort fsocity.dic | uniq | cat > fsocity.dic.uniq

Blogissa seuraavaksi käytetään tätä siistittyä tiedostoa wordlistana bruteforce hyökkäyksissä wordpress login pagea vastaan. Käytän samaa komentoa kuin kyseisessä blogissa, eli

hydra -vV -L fsocity.dic.uniq -p wedontcare -o usernames.txt 192.168.56.104 http-post-form '/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log+In:F=Invalid username'

Siellä on selitetty paremmin koko komento. Muun ymmärrän tuosta komennosta paitsi oikeastaan tuon http-post requestin. Kokeillaan koko komentoa nyt silti ja katsotaan mitä tapahtuu. Tässä siis on kyseessä pelkkä username skanni, ei password.

Skannissa meni ehkä noin viidestä kymmeneen minuuttia, en ole ihan varma, en ollut paikalla seuraamassa. Katsotaan tulokset output filestä eli usernames.txt:

Hydra löysi 3 toimivaa usernamea, joista jokainen on elliot mutta eri capitalisaatioilla. Eli username on elliot. Seuraavaksi tarvitsemme vielä salasanan, ja voimme käyttää siihen hyvin samanlaista komentoa:

hydra -vV -l elliot -P fsocity.dic.uniq -o passwords.txt 192.168.56.104 http-post-form '/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log+In:F=is incorrect'

Muokkasimme hieman tuota post formia ja muutimme -p -> -P (-p kokeilee yksittäistä salasanaa, -P kokeilee salasanalistaa). Sama -L -> -l mutta toisinpäin, sama idea. Tallennan nämä myös nämä tulokset erinimiseen tekstitiedostoon, ihan vain selvyyden vuoksi. Komento juoksee taas jonkun aikaa, kunnes saamme tämän:

Eli nyt tiedämme että wordpressin käyttäjätunnus on elliot ja salasana ER28-0652. Kokeillaan sitä wordpress login pagella:

Pääsimme sisään. Vielä pitää päästä sisään järjestelmään, mutta blogipostauksessa on annettu meille seuraava työkalu metasploitissa sitä varten: wp_admin_shell_upload. Etsitään tätä moduulia metasploitista.

Tuosta löysimme kyseisen moduulin. Otin sen myös käyttöön komennolla “use 0“. Katsotaan mitä asetuksia tällä kyseisellä moduulilla on:

Tarpeellisia puuttuvia asetuksia ovat PASSWORD RHOSTS ja USERNAME. Onneksi tiedämme jokaisen arvon, eli ER28-0652, 192.168.56.104 ja elliot. Laitetaan asetukset paikalleen ja kokeillaan:

Outoa. Googlasin tämän virheen ja löysin siihen ratkaisun git-hub kommenteista (Lähde 5). Meidän pitää kirjoittaa “set WPCHECK false“. Itseasiassa aikaisempi kysyjä teki samaa boxia kuin mitä itse nyt teen. Kokeillaan uudestaan.

Saimme tällä kertaa luotua meterpreter sessionin. Jos kirjoitan nyt “shell” meidän pitäisi saada shell-sessio aikaiseksi.

Nyt olemme siis päässeet boksiin sisälle. Meillä ei ole vielä root-accessia, mutta en usko että se olisi erittäin relevanttia tehtävänantoon liittyen, sillä olemme nyt saaneet tehtyä alkuperäisen tavoitteen: murtaudu boksiin metasploitin avulla. Vaikka käytimmehän tässä paljon muutakin, mutta aina pelkkä metasploit ei riitä 🙂

Tämä oli vaikea tehtävä, mutta se saattaa johtua siitä boksista jonka valitsin. En pystynyt ratkaisemaan sitä kokonaan yksin, mutta mielestäni opin tästä paljon, ja minulla on nyt ainakin idea miten voisin edetä tulevaisuudessa samanlaisessa tilanteessa.

d) Skanna HackTheBoxin verkko niin, että tallennat tulokset Metasploitin tietokantoihin.

Unohdin miten tämä tunnilla tehtiin, mutta googlailin hieman ja löysin artikkelin joka selittää miten se toimii (Lähde 6). Eli tuon pitäisi toimia, jos vain teemme db_nmap metasploitin kanssa, ja sen pitäisi tallentaa tulos tietokantaan. Kokeillaan ja katsotaan mitä tapahtuu.

db_nmap -sV 10.10.10.0-255

Teen tämän aika lyhyellä nmap komennolla, tai ainakaan en usko että tarvitsen mitään muuta. Tässä siis ainut flagi on -sV joka tarkoittaa sitä että se tekee myös versioskannin porteille. Olisin voinut käyttää ip-osoitteita koneista mitä minulla oli jo etukäteen aiemmista skanneista, mutta ajattelin että silloin se ei välttämättä tallennu databaseen kunnolla. En myöskään halunnut käyttää -oA koska tämän on tarkoitus tallentaa tulokset muutenkin. Kokeillaan.

Skannissa menee jonkun aikaa ihan oletetusti. Nyt meidän pitää tarkistaa onko se tallentunut tietokantaan. Tehdään komento “hosts” ja katsotaan onko mitään tallentunut.

Okei, näyttää siltä että tulokset ovat tallentuneet. Voimme tutkiskella niitä vielä tarkemmin komennolla “services -c name,info <ip_osoite>“. Pari esimerkkiä:

Tuolla tavalla voimme nähdä myös servicet. Portinkin saa näkyviin lisäämällä aiempaan komentoon port osuuden, esimerkiksi “services -c name,port,info <ip_osoite>“.

Nyt meillä on siis porttiskannauksen tulokset tallennettuna metasploitin tietokannassa (toivottavasti tein kaiken oikein).

Lähteet:

Läksyt on otettu täältä: http://terokarvinen.com/2020/tunkeutumistestaus-kurssi-pentest-course-ict4tn027-3003/

Lähde 1: https://metasploit.help.rapid7.com/docs/metasploitable-2-exploitability-guide

Lähde 2: https://learning.oreilly.com/library/view/metasploit-penetration-testing/9781788623179/

Lähde 3: https://www.vulnhub.com/entry/mr-robot-1,151/

Lähde 4: https://blog.christophetd.fr/write-up-mr-robot/

Lähde 5: https://github.com/rapid7/metasploit-framework/issues/10838

Lähde 6: https://www.offensive-security.com/metasploit-unleashed/using-databases/

Caius Juvonen 2020

Tunkeutumistestaus läksyt viikko 4

a) CinCan-työpaja. Raportoi CinCan-työpajan harjoitus. Tämän raportin voi kirjoittaa jälkikäteen muistista. Voit työpajan aikana laittaa ylös komentoja ja avainsanoja, mutta keskity harjoituksiin ja seuraamiseen. Muista merkitä raporttiisi, että se on jälkikäteen muistinvaraisesti kirjoitettu.

Tuossa oli kyseinen tehtävänanto, ja kuten tuossa on sanottukkin, tämä on kirjoitettu esityksen jälkeen muistista, enkä ottanut esityksen aikana ylös muistiinpanoja.

Esityksen flow oli aika simppeli: eka hieman teoriaa diaesityksen avulla missä puhuttiin cincanista ja siitä minkälaisia tapauksia workshopissa on. Sen jälkeen varmistimme että kaikilla toimii cincan oikein cincan run cincan/volatility komennon avulla. Itselläni dockerilla ei ollut oikeita käyttöoikeuksia, mutta ratkaisin sen. Tämän jälkeen pääsimme tekemään hieman workshoppia, josta itse ehdin tehdä osan yhdestä tehtävästä ja sitten lopuksi esittäjä näytti meille miten muut tehtävät tehtäisiin.

Cincan on siis työkalu jolla voidaan analysoida esimerkiksi haittaohjelmia, mutta se menee sitäkin pidemmälle, sillä sen avulla pystyy analysoimaan hyökkäyksiä ylipäätään kuten vaikka phishing sähköposteja. Muistan että cincanissa oli työkalu millä pystyimme ensinnäkin tiedustelemaan turvallisesti phishing siteä ottamalla esimerkiksi sen lähdekoodi ja parit screenshotit siitä, miltä sivusto näyttää. Tämä vaikutti erittäin hyödylliseltä työkalulta epäilyttävien sivustojen tarkistamista varten. Cincan on kuitenkin kohtuullisen haastava pelkästään asentaa, eikä se toimi tässä kohtaa ihan niin hyvin, vaan bugeja on paljon. Esityksessä jäi hieman harmittamaan se, että esittäjä ei vaikuttanut itsekkään aina tietoiselta siitä, että miten asiat toimivat tai miten teemme jonkun asian X, ja osa esitetyistä asioista meni kokonaan ohi, ainakin itseltäni. Työpajassa oli kolme esimerkki tapausta mitä pystyimme yrittämään ratkoa: android APK haittaohjelma, phishing email tapaus ja hieman vaikeampi memory dump ongelma (tai jotain memoryyn liittyvää, unohdin hieman sillä sitä ei käsitelty niin paljoa).

Työpajassa esiteltiin myös muita työkaluja joilla pystyttiin esim lukemaan haittaohjelmien lähdekoodia ja päättelemään siitä erilaisia asioita. Mielestäni yksi esimerkki oli ransomware tyyppinen ohjelma joka käytti AES-enkryptausta, mutta koodista löytyi esimerkiksi decryptaus avain jolla olisimme pystyneet decryptaamaan tiedostot vaikka tämä ransomware olisi niihin päässyt käsiksi. Sillä tavalla uskon, että ohjelmasta olisi kyllä huomattavaa apua. Myös työkaluja on hyvin monenlaisia, ja itse pääsin kokeilemaan vain pientä murto-osaa niistä työpajan aikana (teimme työpajassa lähinnä vain yhtä esimerkkiä, loput näytettiin). Taas pieni valitus esittämisestä: kun olin itse yrittänyt ratkaista tiettyä kohtaa ja mielestäni ymmärsin mitä siinä tehtiin ja pääsinkin aika pitkälle, seuraavaksi kun esittelijä näytti miten se tehdään hän käytti monimutkaisia komentoja joita ei oikeastaan selitetty laisinkaan. Esitys ja työpaja oli muuten oikein passeli ja tykkäsin tutustua cincaniin, mutta esitys itsessään ei ollut kauhean hyvä.

Esityksestä jäi kuitenkin semmoinen mielikuva ainakin itselleni että uskon että cincanista voisi olla tulevaisuudessa itselleni hyötyä. Sitä pitää vain hieman parantaa, sillä tällä hetkellä se on hieman turhan hankala niin sanotusti, mutta käsittääkseni se olikin vielä hieman beta versiossa.

b) Omat CinCanit. Kokeile Cincania itse. Voit käyttää opettuja ominaisuuksia uuteen, itse valitsemaasi näytteeseen. Tai voit kokeilla uutta ominaisuutta vanhaan näytteeseen.

Ajattelin tässä kokeilla vanhoihin näytteisiin jotain uutta työkalua. Löysin cincan toolsit tältä sivulta: https://cincan.io/tools/ (Lähde 1). Olen tallentanut workshopissa näytetyt näytteet kansioon /home/caius/malware_analysis/workshops/Haaga-Helia. Tässä oli myös pari muuta workshoppia jotka on näköjään CRIM ja disobeyta varten. Kokeilen nyt ensin näihin Haaga-Helia workshop juttuihin, ja jos en löydä jotain järkevää kokeiltavaa niin vaihdan noihin muihin näytteisiin.

Haluaisin tehdä jotain lisää tuolla phishing-sähköpostilla jota kävimme workshopissa läpi. Käytin ainakin headless thunderbirdiä, joten kokeilen etsiä jotain muuta sopivaa cincanin tools sivulta.

Löysin sellaisen kuin virustotal, ja ajattelin kokeilla sitä yhtä urlia vastaan jonka löysin aiemmin phishing taskia suorittaessani. Kyseinen url siis http://money.cincan.io/www.banking.com/banking.html . Voin käyttää virustotalia komennolla virustotal “url” eli

virustotal.py http://money.cincan.io/www.banking.com/banking.html

Ennen tätä haetaan kuitenkin virustotal. Tämä hoituu komennolla “cincan run cincan/virustotal“. Nyt meillä on se, ja se kertoo että virustotalia voi käyttää syntaxilla “virustotal.py”.

Näköjään syntaksti oli silti väärin. Sain sen “toimimaan” komennolla

cincan run cincan/virustotal --url_file susp_link --output susp_link_output

mutta valitettavasti tarvitsen jonkinlaisen API keyn tätä käyttäekseni. En jaksanut alkaa säheltämään, joten halusin kokeilla jotain toista työkalua. Löysin toisen samanlaisen työkalun, jolla koitin tehdä täsmälleen samaa eli siis skannata tämän kyseisen urlin, ja tämän työkalun nimi oli jsunpack-n. Käytin sitä komennolla

cincan run cincan/jsunpack-n -u http://money.cincan.io/www.banking.com/banking.html -d url_skan -V

Tämä yritti skannata kyseistä osoitetta, mutta tässä osoitteessa ei ollut javascriptiä joten mitään ikävää skriptiä ei löydetty. Kävin vielä katsomassa output filen, ja se oli laittanut sivuston lähdekoodin tähän kyseiseen tiedostoon, eli olisimme itse voineet lukea mitä siellä oikeen tapahtuu. Kyseessä oli kuitenkin pelkästään phishing sivusto, se ei yrittänyt mitään malicious koodinpätkää. Pääsin kuitenkin kokeilemaan muitakin työkaluja. Tuo jsunpack-n vaikuttaa ihan hyödylliseltä tiedostojen ja urlien tutkimiseen turvallisesti.

c) Arviosi CinCanista. Mikä CinCanissa on parasta? Missä voisit hyödyntää sitä (töissä, harrastuksissa, koulussa…)? Suosittelisitko CinCania? Kenelle? Miten CinCania voisi parantaa?

Cincan vaikuttaa erittäin lupaavalta, ja uskon että jos kaikki menee sen kehityksessä hyvin niin siitä voi tulla erittäin monikäyttöinen työkalu tietoturvan ammatilaisille. Tällä hetkellä isoimmat valitukseni ovat että cincan vaikuttaa olevan hyvin beta-vaiheessa. Se on vaikea asentaa, sitä on vaikea käyttää, ja se on hieman sekava. Se ei tunnu valmiilta ohjelmalta. Mutta oletan että tämä parantuu samalla kun cincania työstetään. Itse näkisin käyttäväni tätä harrastusten parissa, eli tietoturvan. Tämä voisi olla hyödyllinen työkalu monessa eri paikassa, kuten vaikka esimerkiksi CTF-pelejä tehdessä.

Suosittelisin cincanin kokeilemista tietoturvan ammattilaisille ja viruksista yms. kiinnostuneille, sillä se vaikuttaa hyvin lupaavalta työkalulta. Itse en ole vielä varma käyttäisinkö, en ole päässyt näkemään mihin kaikkeen cincan vielä pystyy, mutta se vaikuttaa erittäin voimakkaalta työkalulta. Haluaisin vain sen hieman enemmän polished tilaan ennenkuin lähtisin ylistämään sitä, koska tämän ohjelmiston asennus on jo semmoinen seikkailu että tarvitset luultavasti ihan uuden virtual machineenkin jossa on vaaditut järjestelmävaatimukset. Kyllä cincan silti vaikuttaa olevan ihan käytettävässä tilassa jo, joten sitä voi käyttää mikäli sille löytää jonkin erityisen hyvän käyttökohteen.

Arvio cincanin tämän hetkisestä tilanteesta 6.5/10.

Caius Juvonen 2020

Lähteet:

Lähde 1: https://cincan.io/tools/

Läksyt otettu täältä: http://terokarvinen.com/2020/tunkeutumistestaus-kurssi-pentest-course-ict4tn027-3003/

Design a site like this with WordPress.com
Get started