*This writeup is also readable on my [GitHub repository](https://github.com/shawnduong/zero-to-hero-hacking/blob/master/writeups/closed/2021-uiuctf.md) and [personal website](https://shawnd.xyz/blog/2021-08-05/Performing-Digital-Forensics-on-an-Apple-Tablet-to-Recover-Evidence).*

## forensics/Tablet 1

*Challenge written by WhiteHoodHacker.*

> Red has been acting very sus lately... so I took a backup of their tablet to
> see if they are hiding something!  
>  
> It looks like Red has been exfiltrating sensitive data bound for Mira HQ to
> their own private server. We need to access that server and contain the
> leak.

I have to host this file on my personal site because GitHub doesn't like how
large it is.

Files:
[`tablet.tar.gz`](https://shawnd.xyz/blog/uploads/2021-08-05/tablet.tar.gz)

Checksum (SHA-1):

```  
27dfb3448130b5e4f0f73a51d2a41b32fd81b284 tablet.tar.gz  
```

To preface, I just want to say that this was a really fun challenge! It
involves performing digital forensics on an Apple tablet using a given
filesystem backup, investigating a (fictional) target, interacting with SQLite
databases used by some common applications, and using evidence discovered
through the forensics process to hack into another server. The ideas and
procedures explored are pretty neat and are definitely something that would be
encountered in real-life operations!

Let's first start off the challenge by getting oriented. Based off of the
challenge description, we have a few key pieces of information:

\- Our target is "Red."  
\- We have a backup of Red's tablet.  
\- Red exfiltrated data to a private server.  
\- Our objective is to gain control of this server and contain the leak.

The file that we're given is a `.tar.gz` file, meaning that it's a tarball
that's been gzipped; a tarball is a file format that combines multiple files
into a single file, and gzip is a file compression format. We can decompress
the gzip and extract the files from the tarball using the `gunzip` and `tar`
utilities, additionally passing `xf` (extract file) to `tar` as a command line
argument:

```sh  
[skat@anubis:~/work/UIUCTF] $ ls  
tablet.tar.gz  
[skat@anubis:~/work/UIUCTF] $ gunzip tablet.tar.gz  
[skat@anubis:~/work/UIUCTF] $ tar xf tablet.tar  
[skat@anubis:~/work/UIUCTF] $ ls  
private tablet.tar  
```

We can see that we've extracted a new directory: `private/`. We can get
oriented by exploring the directory; a great utility is `tree`, which will
display a tree structure of the filesystem starting from your current active
directory if no additional arguments are supplied.

```sh  
[skat@anubis:~/work/UIUCTF] $ cd private/  
[skat@anubis:~/work/UIUCTF/private] $ ls  
var  
[skat@anubis:~/work/UIUCTF/private] $ cd var/  
[skat@anubis:~/work/UIUCTF/private/var] $ ls  
buddy empty hardware iomfb_bics_daemon Keychains logs mobile
MobileSoftwareUpdate networkd protected run tmp  
containers folders installd keybags log 'Managed Preferences' MobileDevice
msgs preferences root staged_system_apps wireless  
[skat@anubis:~/work/UIUCTF/private/var] $ tree  
.  
├── buddy  
├── containers  
│ ├── Data  
│ │ └── System  
│ │ ├── 0484B045-1EFD-4EC1-9B74-3E7665974A42  
│ │ │ ├── Documents [error opening dir]  
│ │ │ ├── Library [error opening dir]  
│ │ │ └── tmp [error opening dir]  
│ │ ├── 1CB5E5B6-3849-4CA0-8DCD-BF5A521286B9  
│ │ │ ├── Documents [error opening dir]  
│ │ │ ├── Library [error opening dir]  
│ │ │ └── tmp [error opening dir]  
│ │ ├── 28841A8D-11F8-4013-8D5D-B02B63B944F4  
│ │ │ ├── Documents [error opening dir]  
│ │ │ ├── Library [error opening dir]  
│ │ │ └── tmp [error opening dir]  
│ │ ├── 2FD33CE1-DDAD-4FEC-A4F5-55144CBA75EB  
│ │ │ ├── Documents [error opening dir]  
│ │ │ ├── Library [error opening dir]  
│ │ │ └── tmp [error opening dir]  
│ │ ├── 416AB7BD-5EC1-4075-9704-44048CF01074  
│ │ │ ├── Documents [error opening dir]  
│ │ │ ├── Library [error opening dir]  
│ │ │ └── tmp [error opening dir]  
│ │ ├── 4BA18D97-352A-475E-9C22-36315FF4C868  
│ │ │ ├── Documents [error opening dir]  
│ │ │ ├── Library [error opening dir]  
\-- snip --  
```

Whoa, that's a lot of information to take in! In fact, `tree`'s output goes on
for 12,541 lines in total. This is common in any digital forensics
investigation: you're given such a great quantity of information that it would
be impractical to go through every single one individually, so you must be
smart and precise about how you select certain pieces of evidence such that
you make good use of your time while also not compromising the value of the
information that you do uncover. We'll get back to this in a moment.

Before we dig too deep into the investigation itself, we can see that there
are a bunch of errors in opening up directories according to the output of
`tree`. Let's select a sample one,
`./containers/Data/System/0484B045-1EFD-4EC1-9B74-3E7665974A42/Documents/`,
and find out why we're having trouble opening up these directories:

```sh  
[skat@anubis:~/work/UIUCTF/private/var] $ ls
./containers/Data/System/0484B045-1EFD-4EC1-9B74-3E7665974A42/Documents/  
ls: cannot open directory
'./containers/Data/System/0484B045-1EFD-4EC1-9B74-3E7665974A42/Documents/':
Permission denied  
[skat@anubis:~/work/UIUCTF/private/var] $ ls -l
./containers/Data/System/0484B045-1EFD-4EC1-9B74-3E7665974A42/  
total 12  
d--------- 2 skat skat 4096 Jul 23 10:36 Documents  
d--------- 4 skat skat 4096 Jul 23 10:36 Library  
d--------- 2 skat skat 4096 Jul 23 10:36 tmp  
```

Of course we can't access anything -- [the
modes](https://github.com/shawnduong/zero-to-hero-
hacking/blob/master/linux/permissions-and-modes.md) are insufficient for read
access! In fact, we have neither read, write, nor execution permissions. We
can solve all of these problems at once by giving ourselves all three
permissions for all files and directories in the backup, which can easily be
done recursively with `chmod -R`:

```sh  
[skat@anubis:~/work/UIUCTF/private/var] $ chmod -R 700 *  
[skat@anubis:~/work/UIUCTF/private/var] $ tree  
.  
├── buddy  
├── containers  
│ ├── Data  
│ │ └── System  
│ │ ├── 0484B045-1EFD-4EC1-9B74-3E7665974A42  
│ │ │ ├── Documents  
│ │ │ ├── Library  
│ │ │ │ ├── Caches  
│ │ │ │ └── Preferences  
│ │ │ └── tmp  
│ │ ├── 1CB5E5B6-3849-4CA0-8DCD-BF5A521286B9  
│ │ │ ├── Documents  
│ │ │ ├── Library  
│ │ │ │ ├── Caches  
│ │ │ │ └── Preferences  
│ │ │ └── tmp  
│ │ ├── 28841A8D-11F8-4013-8D5D-B02B63B944F4  
│ │ │ ├── Documents  
│ │ │ ├── Library  
│ │ │ │ ├── Caches  
│ │ │ │ │ ├── functions.data  
│ │ │ │ │ ├── functions.list  
│ │ │ │ │ ├── libraries.data  
│ │ │ │ │ └── libraries.list  
│ │ │ │ └── Preferences  
│ │ │ └── tmp  
│ │ ├── 2FD33CE1-DDAD-4FEC-A4F5-55144CBA75EB  
│ │ │ ├── Documents  
│ │ │ ├── Library  
│ │ │ │ ├── Caches  
│ │ │ │ └── Preferences  
│ │ │ └── tmp  
│ │ ├── 416AB7BD-5EC1-4075-9704-44048CF01074  
\-- snip --  
```

Great, no more errors! Based on the briefing earlier, we know that we
currently have a backup of Red's tablet. Before we start combing through the
files, let's see if we can first find out what type of tablet Red has. Knowing
what type of device we're investigating may help us locate things and orient
ourselves much more effectively.

```sh  
[skat@anubis:~/work/UIUCTF/private/var] $ ls  
buddy empty hardware iomfb_bics_daemon Keychains logs mobile
MobileSoftwareUpdate networkd protected run tmp  
containers folders installd keybags log 'Managed Preferences' MobileDevice
msgs preferences root staged_system_apps wireless  
```

`hardware/` looks interesting.

```sh  
[skat@anubis:~/work/UIUCTF/private/var] $ tree hardware  
hardware  
└── FactoryData  
└── System  
└── Library  
└── Caches  
├── apticket.der  
└── com.apple.factorydata  
├── ccrt-00008000-000007B6C93ED5F9  
├── FSCl-F58717371LRHGXG8BB  
├── hop0-F58717371LRHGXG8BB  
├── NvMR-F58717371LRHGXG8BB  
├── pcrt-e245a4599e9b3fb42f334fc4b1c4cb3509582869  
├── scrt-00008000-000007B6C93ED5F9  
├── seal-00008000-000007B6C93ED5F9  
└──
trustobject-5340B6A059BDB732E715E7BB1B292EDCD45C2A8D1D07E6039D3F338D7C4428AB  
```

Just like that, we now know that we're on an Apple system. Apple's line of
tablets are iPads, so we can safely assume that this is an Apple iPad. This
gives us a starting point from which we can do our research from.

It's always important to get oriented when dealing with a new set of data. By
first understanding that we're dealing with an iPad device that's running
iPadOS, we can better and more precisely inspect the system while keeping in
mind that its behavior will be that of an iPadOS; this removes an element of
unpredictability from the equation.

According to Wikipedia's article on
[iPadOS](https://web.archive.org/web/20210728223925/https://en.wikipedia.org/wiki/IPadOS),
iPadOS is a rebranded variant of iOS. [iPadOS
14](https://web.archive.org/web/20210728224854/https://en.wikipedia.org/wiki/IPadOS_14),
the current major release of iPadOS, seems to at least partially mirror the
features of iOS 14. Although we're not sure if this specific backup is of an
iPadOS 14 device, we can at least make the educated assumption that vital
features and internal workings may stay consistent; our research on iPadOS 14
and iOS 14 may still be relevant to whatever specific operating system is on
the device being investigated. Doing more research on what type of filesystem
is utilized by iOS 14 brings us to an article from Apple's own documentation:
["File System
Basics."](https://web.archive.org/web/20210604045749/https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html)

Because we know that Red had exfiltrated data to a private server, knowing the
tools that Red may have used may reveal where this private server is, how Red
communicated with this server, and how Red may have connected to this server.
What we're looking for is a host, either in the form of a domain or an IP
address, within the data of some application.

The aforementioned official Apple documentation tells us something important:

> For security purposes, an iOS app’s interactions with the file system are
> limited to the directories inside the app’s sandbox directory. During
> installation of a new app, the installer creates a number of container
> directories for the app inside the sandbox directory.

We're targeting applications that Red may have used to exfiltrate data since
we're searching for the potential host that Red may have connected to.
Applications on an iOS device -- and by extension, most likely on an iPadOS
device -- have their files confined to containers for security reasons. Let's
find where these containers are located using `find`:

```sh  
[skat@anubis:~/work/UIUCTF/private/var] $ find . -name "Containers"  
./mobile/Containers  
```

Let's navigate to the containers and get oriented using `tree`:

```sh  
[skat@anubis:~/work/UIUCTF/private/var] $ cd ./mobile/Containers/  
[skat@anubis:~/work/UIUCTF/private/var/mobile/Containers] $ tree  
.  
├── Data  
│ ├── Application  
│ │ ├── 0086F008-29FB-4F0A-AEF7-2EA84DBCE5BD  
│ │ │ ├── Documents  
│ │ │ ├── Library  
│ │ │ │ ├── Caches  
│ │ │ │ └── Preferences  
│ │ │ ├── SystemData  
│ │ │ └── tmp  
│ │ ├── 009B0AA6-834F-433E-A1CC-D573DE8ADF6F  
│ │ │ ├── Documents  
│ │ │ ├── Library  
│ │ │ │ ├── Caches  
│ │ │ │ ├── Preferences  
│ │ │ │ └── SplashBoard  
│ │ │ │ └── Snapshots  
│ │ │ │ └── com.apple.dt.XcodePreviews - {DEFAULT GROUP}  
│ │ │ │ ├── [email protected]  
│ │ │ │ ├── [email protected]  
│ │ │ │ ├── [email protected]  
│ │ │ │ ├── [email protected]  
│ │ │ │ ├── [email protected]  
│ │ │ │ ├── [email protected]  
│ │ │ │ ├── [email protected]  
│ │ │ │ └── [email protected]  
│ │ │ ├── SystemData  
│ │ │ └── tmp  
│ │ ├── 05AB72AC-91C4-4A63-9116-D5C43068EA5F  
│ │ │ ├── Documents  
│ │ │ ├── Library  
│ │ │ │ ├── Caches  
│ │ │ │ ├── Preferences  
│ │ │ │ └── SplashBoard  
│ │ │ │ └── Snapshots  
│ │ │ │ └── com.apple.WebSheet - {DEFAULT GROUP}  
\-- snip --  
```

7,474 lines of output! We don't really care about most of these files, but we
do know now where the apps are located. Let's try to get a list of all apps
that are available on this system. Something that you may have noticed is that
apps have names such as `com.apple.dt.XcodePreviews` and `com.apple.WebSheet`,
something known was **reverse domain name notation.** We can use this to our
advantage to create an expression that will only give us directories or files
with an app name since we know that it will most likely start with some sort
of common top-level domain like ".com" or ".org." Let's `find` these:

```sh  
[skat@anubis:~/work/UIUCTF/private/var/mobile/Containers] $ find . -name
"com.*"  
./Data/PluginKitPlugin/6C4CE4A9-900B-4177-B7EA-770F4DCE7C57/SystemData/com.apple.chrono  
./Data/PluginKitPlugin/6C4CE4A9-900B-4177-B7EA-770F4DCE7C57/SystemData/com.apple.chrono/placeholders/com.apple.Maps  
./Data/PluginKitPlugin/6C4CE4A9-900B-4177-B7EA-770F4DCE7C57/Library/Caches/com.apple.dyld  
./Data/PluginKitPlugin/9CEFB254-EACD-409A-ADD6-F526CDE241DD/Library/Caches/com.apple.Animoji.StickersApp.MessagesExtension  
./Data/PluginKitPlugin/9CEFB254-EACD-409A-ADD6-F526CDE241DD/Library/Caches/com.apple.Animoji.StickersApp.MessagesExtension/com.apple.metalfe  
./Data/PluginKitPlugin/9CEFB254-EACD-409A-ADD6-F526CDE241DD/Library/Caches/com.apple.Animoji.StickersApp.MessagesExtension/com.apple.metal  
./Data/PluginKitPlugin/26BC37DE-ECA3-4DE2-83FD-
BB19CC960116/Library/SyncedPreferences/com.apple.kvs  
./Data/PluginKitPlugin/26BC37DE-ECA3-4DE2-83FD-
BB19CC960116/Library/SyncedPreferences/com.apple.kvs/ChangeTokens/EndToEndEncryption/WeatherIntents/com.apple.weather  
./Data/PluginKitPlugin/26BC37DE-ECA3-4DE2-83FD-
BB19CC960116/Library/SyncedPreferences/com.apple.weather.WeatherIntents.plist  
./Data/PluginKitPlugin/E00F3026-1873-4BF6-BE3E-1E10F75FEB71/Library/SyncedPreferences/com.apple.mobilenotes.SharingExtension-
com.apple.notes.analytics.plist  
./Data/PluginKitPlugin/E00F3026-1873-4BF6-BE3E-1E10F75FEB71/Library/SyncedPreferences/com.apple.mobilenotes.SharingExtension.plist  
./Data/PluginKitPlugin/4DCDF246-E707-4F52-B616-39B0BB323238/SystemData/com.apple.chrono  
./Data/PluginKitPlugin/4DCDF246-E707-4F52-B616-39B0BB323238/SystemData/com.apple.chrono/placeholders/com.apple.tips  
./Data/PluginKitPlugin/4DCDF246-E707-4F52-B616-39B0BB323238/Library/Caches/com.apple.dyld  
./Data/PluginKitPlugin/B3D150FB-
FD7E-4A6D-A4B0-C8277CADF6DF/SystemData/com.apple.chrono  
./Data/PluginKitPlugin/B3D150FB-
FD7E-4A6D-A4B0-C8277CADF6DF/SystemData/com.apple.chrono/placeholders/com.apple.mobilenotes.FolderWidget  
./Data/PluginKitPlugin/B3D150FB-
FD7E-4A6D-A4B0-C8277CADF6DF/SystemData/com.apple.chrono/placeholders/com.apple.mobilenotes.NoteWidget  
./Data/PluginKitPlugin/B3D150FB-
FD7E-4A6D-A4B0-C8277CADF6DF/Library/Caches/com.apple.dyld  
./Data/PluginKitPlugin/B3D150FB-
FD7E-4A6D-A4B0-C8277CADF6DF/Library/Caches/com.apple.dyld/com.apple.mobilenotes.WidgetExtension.closure  
./Data/PluginKitPlugin/B3D150FB-
FD7E-4A6D-A4B0-C8277CADF6DF/Library/SyncedPreferences/com.apple.mobilenotes.WidgetExtension-
com.apple.notes.analytics.plist  
./Data/PluginKitPlugin/B3D150FB-
FD7E-4A6D-A4B0-C8277CADF6DF/Library/SyncedPreferences/com.apple.mobilenotes.WidgetExtension.plist  
./Data/PluginKitPlugin/09D88789-E428-4922-B8D9-802A7399F256/Library/Preferences/com.apple.FileProvider  
./Data/PluginKitPlugin/09D88789-E428-4922-B8D9-802A7399F256/Library/Preferences/com.apple.FileProvider/com.apple.CloudDocs.MobileDocumentsFileProvider  
./Data/PluginKitPlugin/D02660B1-0F69-424C-B13C-AB0D17D1D979/SystemData/com.apple.chrono  
./Data/PluginKitPlugin/D02660B1-0F69-424C-B13C-AB0D17D1D979/SystemData/com.apple.chrono/placeholders/com.apple.tv  
\-- snip --  
```

Alright, that's still a lot to take in! Let's use `awk` to split each line by
the `/` delimiter and print only the final token containing the name, and then
let's `sort` it and make a unique list out of it with `uniq -u`. Let's
additionally filter out all the built-in Apple stuff by performing a reverse
`grep` on the "com.apple" string:

```sh  
[skat@anubis:~/.../Containers] $ find . -name "com.*" | awk -F '/' '{print $NF}' | sort | uniq -u | grep -v "com.apple"  
com.crashlytics  
com.crashlytics.data  
com.firebase.FIRInstallations.plist  
com.google.gmp.measurement.monitor.plist  
com.google.gmp.measurement.plist  
com.hackemist.SDImageCache  
com.hammerandchisel.discord - {DEFAULT GROUP}  
com.hammerandchisel.discord.plist  
com.hammerandchisel.discord.savedState  
com.innersloth.amongus - {DEFAULT GROUP}  
com.innersloth.amongus.plist  
com.innersloth.amongus.savedState  
com.itimeteo.webssh - {DEFAULT GROUP}  
com.itimeteo.webssh.plist  
com.itimeteo.webssh.savedState  
com.plausiblelabs.crashreporter.data  
```

Awesome! Right away, I notice `com.itimeteo.webssh`. Could Red have been using
SSH to exfiltrate data? Let's find out by continuing to explore this
application and its associated saved data:

```sh  
[skat@anubis:~/work/UIUCTF/private/var/mobile/Containers] $ find . -name
"com.itimeteo.webssh - {DEFAULT GROUP}"  
./Data/Application/AA7DB282-D12B-4FB1-8DD2-F5FEF3E3198B/Library/SplashBoard/Snapshots/com.itimeteo.webssh
- {DEFAULT GROUP}  
[skat@anubis:~/work/UIUCTF/private/var/mobile/Containers] $ cd
./Data/Application/AA7DB282-D12B-4FB1-8DD2-F5FEF3E3198B/  
[skat@anubis:~/work/UIUCTF/private/var/mobile/Containers/Data/Application/AA7DB282-D12B-4FB1-8DD2-F5FEF3E3198B]
$ tree  
.  
├── Documents  
├── Library  
│ ├── Application Support  
│ │ └── webssh.db  
│ ├── Caches  
│ │ └── com.apple.dyld  
│ │ └── WebSSH.closure  
│ ├── Preferences  
│ │ └── com.itimeteo.webssh.plist  
│ ├── Saved Application State  
│ │ └── com.itimeteo.webssh.savedState  
│ │ └── KnownSceneSessions  
│ │ └── data.data  
│ └── SplashBoard  
│ └── Snapshots  
│ ├── com.itimeteo.webssh - {DEFAULT GROUP}  
│ │ ├── [email protected]  
│ │ ├── [email protected]  
│ │ ├── [email protected]  
│ │ ├── [email protected]  
│ │ ├── [email protected]  
│ │ ├── [email protected]  
│ │ ├── [email protected]  
│ │ ├── [email protected]  
│ │ └── downscaled  
│ │ └── [email protected]  
│ └── sceneID:com.itimeteo.webssh-default  
│ └── downscaled  
├── StoreKit  
│ └── receipt  
├── SystemData  
└── tmp

18 directories, 14 files  
```

I see a `webssh.db` file, which seems interesting. Perhaps this file will
contain some saved data regarding Red's data exfiltration?

```sh  
[skat@anubis:~/.../AA7DB282-D12B-4FB1-8DD2-F5FEF3E3198B] $ cd
"./Library/Application Support"  
[skat@anubis:~/.../Application Support] $ file webssh.db  
webssh.db: SQLite 3.x database, last written using SQLite version 3032003  
[skat@anubis:~/.../Application Support] $ sqlite3 webssh.db  
```

```sql  
SQLite version 3.36.0 2021-06-18 18:36:39  
Enter ".help" for usage hints.  
sqlite> .dump  
PRAGMA foreign_keys=OFF;  
BEGIN TRANSACTION;  
CREATE TABLE NSFValues(ROWID INTEGER PRIMARY KEY, NSFKey TEXT, NSFAttribute
TEXT, NSFValue NONE, NSFDatatype TEXT);  
INSERT INTO NSFValues
VALUES(1,'4F479229-163D-469B-AD21-E23CDFDAFBBC','privatePart',replace('-----
BEGIN OPENSSH PRIVATE
KEY-----\n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\n9HmS+uFZxtacdqj4KdrHPcagm3Q=\n
-----END OPENSSH PRIVATE KEY-----\n','\n',char(10)),'TEXT');  
INSERT INTO NSFValues
VALUES(2,'4F479229-163D-469B-AD21-E23CDFDAFBBC','objectIsDeleted',0,'REAL');  
INSERT INTO NSFValues
VALUES(3,'4F479229-163D-469B-AD21-E23CDFDAFBBC','objectCreation','2021-07-25
14:12:28:733','TEXT');  
INSERT INTO NSFValues
VALUES(4,'4F479229-163D-469B-AD21-E23CDFDAFBBC','objectType','privateKey','TEXT');  
INSERT INTO NSFValues
VALUES(5,'4F479229-163D-469B-AD21-E23CDFDAFBBC','objectEdition','2021-07-25
14:12:28:739','TEXT');  
INSERT INTO NSFValues
VALUES(6,'4F479229-163D-469B-AD21-E23CDFDAFBBC','isEncrypted',1,'REAL');  
INSERT INTO NSFValues
VALUES(7,'4F479229-163D-469B-AD21-E23CDFDAFBBC','name','private_key','TEXT');  
INSERT INTO NSFValues
VALUES(8,'4F479229-163D-469B-AD21-E23CDFDAFBBC','decryptPassword','********','TEXT');  
INSERT INTO NSFValues
VALUES(9,'69933883-557F-4A3D-94ED-F38CEE706B57','objectCreation','2021-07-25
14:11:08:530','TEXT');  
INSERT INTO NSFValues
VALUES(10,'69933883-557F-4A3D-94ED-F38CEE706B57','port_knocking','','TEXT');  
INSERT INTO NSFValues
VALUES(11,'69933883-557F-4A3D-94ED-F38CEE706B57','objectType','connection','TEXT');  
INSERT INTO NSFValues
VALUES(12,'69933883-557F-4A3D-94ED-F38CEE706B57','port_forwarding','','TEXT');  
INSERT INTO NSFValues
VALUES(13,'69933883-557F-4A3D-94ED-F38CEE706B57','type','SSH','TEXT');  
INSERT INTO NSFValues
VALUES(14,'69933883-557F-4A3D-94ED-F38CEE706B57','host','red.chal.uiuc.tf','TEXT');  
INSERT INTO NSFValues
VALUES(15,'69933883-557F-4A3D-94ED-F38CEE706B57','objectIsDeleted',0,'REAL');  
INSERT INTO NSFValues
VALUES(16,'69933883-557F-4A3D-94ED-F38CEE706B57','authentication.privateKeyID','4F479229-163D-469B-AD21-E23CDFDAFBBC','TEXT');  
INSERT INTO NSFValues
VALUES(17,'69933883-557F-4A3D-94ED-F38CEE706B57','authentication.password','','TEXT');  
INSERT INTO NSFValues
VALUES(18,'69933883-557F-4A3D-94ED-F38CEE706B57','authentication.2fa','false','TEXT');  
INSERT INTO NSFValues
VALUES(19,'69933883-557F-4A3D-94ED-F38CEE706B57','authentication.user','red','TEXT');  
INSERT INTO NSFValues
VALUES(20,'69933883-557F-4A3D-94ED-F38CEE706B57','groupName','','TEXT');  
INSERT INTO NSFValues
VALUES(21,'69933883-557F-4A3D-94ED-F38CEE706B57','objectEdition','2021-07-25
14:12:31:621','TEXT');  
INSERT INTO NSFValues
VALUES(22,'69933883-557F-4A3D-94ED-F38CEE706B57','name','Red’s
Server','TEXT');  
INSERT INTO NSFValues
VALUES(23,'69933883-557F-4A3D-94ED-F38CEE706B57','port',42069,'REAL');  
CREATE TABLE NSFKeys(ROWID INTEGER PRIMARY KEY, NSFKey TEXT, NSFKeyedArchive
BLOB, NSFCalendarDate TEXT, NSFObjectClass TEXT);  
INSERT INTO NSFKeys
VALUES(1,'4F479229-163D-469B-AD21-E23CDFDAFBBC',X'62706c6973743030d4010203040506070a582476657273696f6e592461726368697665725424746f7058246f626a6563747312000186a05f100f4e534b657965644172636869766572d1080954726f6f748001af10150b0c232425262728292a2b2f37383c3f404344454655246e756c6cd30d0e0f101922574e532e6b6579735a4e532e6f626a656374735624636c617373a8111213141516171880028003800480058006800780088009a81a1b1c1d1e1f2021800a800c800d800f801080118012801380145b70726976617465506172745f100f6f626a656374497344656c657465645e6f626a6563744372656174696f6e5a6f626a656374547970655d6f626a65637445646974696f6e5b6973456e63727970746564546e616d655f100f6465637279707450617373776f7264d20f2c2d2e594e532e737472696e67800b5f110a5f2d2d2d2d2d424547494e204f50454e5353482050524956415445204b45592d2d2d2d2d0a6233426c626e4e7a614331725a586b74646a454141414141436d466c637a49314e69316a6448494141414147596d4e796558423041414141474141414142417471656d704e770a54757772456d706c2b4379325178414141414541414141414541414147584141414142334e7a614331796332454141414144415141424141414267514443347576474b72314d0a3335695a4a6b4255356b4b64754b74424d45467569344a61726b567575444d79307337676b554e353443517a522b70544735755050422f32416f4770413942452f35585258690a654f624b4a71656d784250646655412f5a6c436b66377543736d59354262424253633764504e566741556843654249324a59482f72434b4b51346870574854595242695537590a6b3454394e736b367273495a4b76546e7652462b355a5371466a5941776c7a66662b4567627342675163306b37356a4869456f697564696e596d376b7771454d6e7a585961380a7065725074756b4a3351614f6a67505036744f53443450305837417863732b5537704261505a734e47445931352f517a49523466533479523332696d596a4a314831376e31550a4577344b787146696e70742f71475a54476a6e68454866486641575276776e51346e566972624953556c69757872704d654533766b776c4d63767735554a567a45445a4239380a5852785a577a76647359526a6c577571686150743559674a6858312b334e45306f47484443564d6d6478506453734c38736b6b654d6d4b4f62356b3530455a3165413558462f0a592f782f72434d657171563375773661574e65383876694d67336941542f4234644e3763495330574b582b3267637642506e395a787934587532705341714b6375524a2b544c0a4c76695232386879336c7a4c73414141575141585355506d665777426a45637a4e642f68504765374f376a387a392f676153744d42672b724a57745632446d313836304162680a4e2f756a3244533354486d324f444c6c676b4561634943596733506c776676794b734a447738364c63376b4f552b6a2b774d514c6f536a3545396c59716d4e636f426c5472750a43695577396f53656f65562f527a5175594a3277354447382f5636554669586e5944755457304b6b38792f6c34556a2b397a5367556f68336b666b52484f69763167456a46580a694b78522b2f516b51316f414a6b73343944445833373375746d62685a362f67474762476b46796c4d44654d6b6458773061655449365558306842354479477a31535172476b0a62545a7a5057674d6a7456574a593077764d36617277735431637131736745596a706f57574f66663042514f425578564157333336593248414559702f7a734d434c4c335a6f0a772f36664f6a2b65705272713030525037496c6e556a51433242333871674362496c6c61664f7455525659427835776a4e444e557038644474325852455130687338792b55790a2f3936414b524f53412f506a317a2f36786a774c4171576a67537879694d5770524a504b645371664e444c716d7779753845662f456e743053574c58594b38475043567236580a746a487447522b7376716c3879553034526f4f476949564733517a545a345777444f764568525741307a414841754f756c6371776d3843776c76385a5053303555716f4750780a5634756e3367324454735766614d6536744846715654624e756d756d55615a4c336b47705649634e4a4b6d436e70324650716f3336644b76473256684f4c45714d61476c50760a464158747678714c697a394d54314b72345758795263706d3473316f7934633572685371326f77445a4377516e744d423034724878596b47642b5278616a6f56466473352b630a555a38376f7578322f30623052572f6357423273427a7673545a4d6938573935344b6f4a39644e614957394b2f3461314e4c6a354a594146354a6832513950566369464f78700a6f6953534f41664d71544f5267357a7a2f435337624f35496a59344c63576b31394a4d396d344f32394f6976424f6c5269426a366d42506e66576e6f327668554a6565624c480a3376496a5767654c45564c7639666b4f5a39727332652b5266444d4f5734474154674f68566275436a747143684348585247416c69784c2b4a653147785142673578712f414e0a67383965777a4d324f7539352b4c7745414d7578664c666a33306468417634374c416c4f59762f7a36686d4a41634842654f417568744177744277564832415333586d42717a0a74774668433362575a374f4150625777426a557a63736a326e3776486c72515274426a71302b7a2f4b4a334d442b4574504a362f706f647a343579507173794e364a6b4c63410a4e45562b4a4b6434706b515a6143336d524648416b47334b56344b355753434246546436434c724461557a5357306c31485a4d704a665267623348445642496f7337676e64570a316b416b794b41463672643744717175334a555a37654768777a453138425a71473051507846392f3132326369743376476a4a434f56653865384936446a5a6d5179773867610a4859463634465a61696b7853316333586464686a3857485253776650522b384e437243386457423632427a32394a6f51584c6a393847564738484376347749743145734159330a726669726832364151456c326d506d72776554793152766c75514c4f4b46594a546864713464726e4b6434575150734c4b37756d6833697a616861777631633466374f6c4b480a4d6371766a50667768337165674870704c5577464a5747772f6350314c45332f6a6a6d504a61727071612f376d306437344d33434164596f6f37704d516954634973625634640a2b672b30722f44673269554d6e2f7a45746b653055774d4147326347794e53472b47534243374556547248394332747a55372f6a5046595538753459314934414846617168520a744f72716d2f5541454e64666e427167376b6f6458312f68326c457573546939686b715a5a454d616f4b71456a574d596943764a382b744c707678304f7373314a77514536560a4c335175752b7659635173397843766f4e77304e41716f453262704970464a6530524a6c332b362b47654a437574384830396d366862477a46777157736f564b304c685435410a4b344344774b4933706f426c4b59574758567344426557496439724f69367248706c5965772b502b7773344d6c6453626732516e59626e2f67644c51334a643549494a38782b0a524c6a454b62524a39622b7243544f6951355254577034354b2f71327134753650326b6c51775232455537425633324e6c2b5a6576445a556e56516c4d4937735769747a47460a4f6563346b332f5649633642516338755a34744148304d50696645566f7847316d5a7832767466456351546a4b4c4b627773574b6c4c4d374c41674665335a444a38616965620a7176627843376e6b76694d534c4955775a517a76575243542b7766662f2f776767594942722f4579746346714a633346306539715455763372336168614777493857326732790a39486d532b75465a7874616364716a344b647248506361676d33513d0a2d2d2d2d2d454e44204f50454e5353482050524956415445204b45592d2d2d2d2d0ad2303132335a24636c6173736e616d655824636c61737365735f100f4e534d757461626c65537472696e67a33435365f100f4e534d757461626c65537472696e67584e53537472696e67584e534f626a65637408d2390f3a3b574e532e74696d652341c356f78e5dcc53800ed230313d3e564e5344617465a23d365a707269766174654b6579d2390f413b2341c356f78e5e9b63800e095b707269766174655f6b6579582a2a2a2a2a2a2a2ad2303147485f10134e534d757461626c6544696374696f6e617279a34749365c4e5344696374696f6e61727900080011001a00240029003200370049004c00510053006b007100780080008b0092009b009d009f00a100a300a500a700a900ab00b400b600b800ba00bc00be00c000c200c400c600d200e400f300fe010c0118011d012f0134013e01400ba30ba80bb30bbc0bce0bd20be40bed0bf60bf70bfc0c040c0d0c0f0c140c1b0c1e0c290c2e0c370c390c3a0c460c4f0c540c6a0c6e0000000000000201000000000000004a00000000000000000000000000000c7b','2021-07-25
14:12:28:750','BO');  
INSERT INTO NSFKeys
VALUES(2,'69933883-557F-4A3D-94ED-F38CEE706B57',X'62706c6973743030d4010203040506070a582476657273696f6e592461726368697665725424746f7058246f626a6563747312000186a05f100f4e534b657965644172636869766572d1080954726f6f748001af10220b0c2b2c2d2e2f30313233343536373b41424344454652535455565758595a5e616255246e756c6cd30d0e0f101d2a574e532e6b6579735a4e532e6f626a656374735624636c617373ac1112131415161718191a1b1c80028003800480058006800780088009800a800b800c800dac1e1f201f222324251f272829800e80108011801080128013801480158010801f80208021801e5e6f626a6563744372656174696f6e5d706f72745f6b6e6f636b696e675a6f626a656374547970655f100f706f72745f666f7277617264696e67547479706554686f73745f100f6f626a656374497344656c657465645e61757468656e7469636174696f6e5967726f75704e616d655d6f626a65637445646974696f6e546e616d6554706f7274d2380f393a574e532e74696d652341c356f76643dfb1800fd23c3d3e3f5a24636c6173736e616d655824636c6173736573564e5344617465a23e40584e534f626a656374505a636f6e6e656374696f6e535353485f10107265642e6368616c2e756975632e746608d30d0e0f474c2aa448494a4b8016801780188019a44d4e4f50801a801b801c801d801e5c707269766174654b657949445870617373776f72645332666154757365725f102434463437393232392d313633442d343639422d414432312d453233434446444146424243505566616c736553726564d23c3d5b5c5f10134e534d757461626c6544696374696f6e617279a35b5d405c4e5344696374696f6e617279d2380f5f3a2341c356f78fcf8898800f6c00520065006420190073002000530065007200760065007211a45500080011001a00240029003200370049004c005100530078007e0085008d0098009f00ac00ae00b000b200b400b600b800ba00bc00be00c000c200c400d100d300d500d700d900db00dd00df00e100e300e500e700e900eb00fa010801130125012a012f01410150015a0168016d01720177017f0188018a018f019a01a301aa01ad01b601b701c201c601d901da01e101e601e801ea01ec01ee01f301f501f701f901fb01fd020a02130217021c02430244024a024e02530269026d027a027f0288028a02a300000000000002010000000000000063000000000000000000000000000002a6','2021-07-25
14:12:31:629','ConnectionBO');  
COMMIT;  
```

Well, would you look at that!

```sql  
INSERT INTO NSFValues
VALUES(14,'69933883-557F-4A3D-94ED-F38CEE706B57','host','red.chal.uiuc.tf','TEXT');  
INSERT INTO NSFValues
VALUES(23,'69933883-557F-4A3D-94ED-F38CEE706B57','port',42069,'REAL');  
INSERT INTO NSFValues
VALUES(19,'69933883-557F-4A3D-94ED-F38CEE706B57','authentication.user','red','TEXT');  
INSERT INTO NSFValues
VALUES(1,'4F479229-163D-469B-AD21-E23CDFDAFBBC','privatePart',replace('-----
BEGIN OPENSSH PRIVATE
KEY-----\n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\n9HmS+uFZxtacdqj4KdrHPcagm3Q=\n
-----END OPENSSH PRIVATE KEY-----\n','\n',char(10)),'TEXT');  
INSERT INTO NSFValues
VALUES(8,'4F479229-163D-469B-AD21-E23CDFDAFBBC','decryptPassword','********','TEXT');  
```

We have a host, port, username, SSH private key, and the decryption password
-- five ingredients for an SSH connection! I must admit that I found the
decryption password to be quite humorous; I initially thought that the
password must have been censored, but it is actually, literally `********`.

Let's go ahead and copy that SSH private key into a file, give it the
appropriate permissions, and connect to the server that we just uncovered.
This is an exciting development!

```sh  
[skat@anubis:~/work/UIUCTF] $ cat key  
\-----BEGIN OPENSSH PRIVATE KEY-----  
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  
9HmS+uFZxtacdqj4KdrHPcagm3Q=  
\-----END OPENSSH PRIVATE KEY-----  
[skat@anubis:~/work/UIUCTF] $ chmod 600 key  
[skat@anubis:~/work/UIUCTF] $ ssh -i key -p 42069 [email protected]  
Enter passphrase for key 'key':  
This service allows sftp connections only.  
Connection to red.chal.uiuc.tf closed.  
```

Oh, it looks like the server only allows SFTP connections. Given the context
of the scenario, that makes sense. No worries, we can just connect using SFTP
instead of SSH:

```sh  
[skat@anubis:~/work/UIUCTF] $ sftp -i key -P 42069 [email protected]  
Enter passphrase for key 'key':  
Connected to red.chal.uiuc.tf.  
sftp> pwd  
Remote working directory: /home/red  
sftp> ls -a  
. .. .bash_history .bash_logout .bashrc .profile  
.ssh  
```

Alright, we're in! Let's have a look at the Bash history to see if there's
anything interesting that Red may have done on this system. We can get files
using the `get` command in SFTP:

```sh  
sftp> get .bash_history  
Fetching /home/red/.bash_history to .bash_history  
/home/red/.bash_history 100% 31 0.2KB/s 00:00  
```

```sh  
[skat@anubis:~/work/UIUCTF] $ cat .bash_history  
mv /srv/exfiltrated "/srv/..."  
```

It looks like the file `/srv/exfiltrated` was renamed to `/src/...`. Let's
have a look at that file. We can again get the file using `get`:

```sh  
sftp> cd /srv  
sftp> ls -a  
. .. ...  
sftp> get ...  
Fetching /srv/.../ to ...  
Cannot download non-regular file: /srv/.../  
```

Oh, it's a directory; the file was actually being moved to a directory.

```sh  
sftp> cd ...  
sftp> ls  
important_data.jpg  
sftp> get important_data.jpg  
Fetching /srv/.../important_data.jpg to important_data.jpg  
/srv/.../important_data.jpg 100% 43KB 78.0KB/s 00:00  
```

Awesome, some important data! Let's have a look at it:

![](https://irissec.xyz/uploads/2021-08-07/important_data.jpg)

Just like that, we have a flag!

### Debriefing

We were initially given a backup of Red's tablet and told that Red had been
exfiltrating data to a private server; our objective was to access the server
and contain the leak. We first got oriented and discovered what type of device
it was: an iPad. From here, we began doing research and discovered that iPads
use iPadOS, a variant of iOS, whose filesystem structure is [documented by
Apple](https://web.archive.org/web/20210604045749/https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html).
Learning that applications on an iOS device run inside of containers, we
discover the location of the containers and generate a list of applications
present on the device. We found that there was an SSH client and looked
through the stored application data to discover a host, port, username, SSH
private key, and the decryption password, allowing us to then connect to the
server via SFTP, look through the Bash history, and retrieve the exfiltrated
data.

Although this was just a CTF challenge, the entire process very closely
resembles an operation that could very well happen in real-life operations!
Digital forensics is simply just the branch of forensic science involved with
digital devices. It lends itself to criminal investigations by focusing on the
investigation of digital devices, allowing evidence to be attributed to
suspects, incriminating data to be recovered, and more. I oftentimes playfully
refer to digital forensics as being like a "hacker detective." This challenge
was a great exercise of the digital forensics process: given data, assess the
situation and look for evidence of criminal activity on the digital device.
Being just a CTF challenge, we could have some fun and also additionally hack
into the remote server while avoiding the legal and bureaucratic process that
would have otherwise been required as a prerequisite to such an act in a real-
life investigation.  

Original writeup
(https://irissec.xyz/articles/categories/forensics/2021-08-07/Performing-
Digital-Forensics-on-an-Apple-Tablet-to-Recover-Evidence).