Po drátě 6: Řešení úlohy č. 8

Zadání úlohy nabádá ke stažení uvedeného taru se zálohou. Proč ne, jdeme stahovat. Server kupodivu neprotestuje a při zadání uvedené adresy soubor vydá. Problém je jinde, soubor má asi 11 GB a server navíc posílá data opravdu pomalu. Vypadá to, že se celý soubor bude stahovat ještě nějakých 100 dní.

Soutěž ale končí už za několik málo dní, takže to bude chtít nějaký lepší způsob, jak se dostat k heslu. S trochou trpělivosti se můžeme dočkat stažení pár set kB ze začátku archivu. Tar naštěstí není komprimovaný a jednotlivé soubory jsou uložené postupně za sebou, takže se můžeme podívat, co jsme si stáhli. Standardním příkazem ve stylu tar tvf backup.tar získáme výpis prvních souborů v archivu. Nějaké RFC a link.url.

Heslo z toho ale nevypadne, mimo několika aprílových RFC (které žádný hlubší smysl skutečně neměly) se najde RFC2616 se specifikací HTTP protokolu a odkaz na popis formátu taru. Oboje se může při řešení úlohy hodit, ale po hesle se bude třeba podívat jinde.

Buďto pohledem do hlaviček odpovědi anebo jednoduchým vyzkoušením navazovaného stahování jde jistit, že server podporuje HTTP ranges. Tudy vede cesta.

Následuje několik možností jak pokračovat. Organizátorský návrh řešení obsahoval využití sparse-files a navazovaného stahování. K tomu ani není potřeba programovat. Z popisu taru zjistíme, že archiv je rozdělený na bloky o délce 512 bytů, první blok je hlavička souboru či adresáře a následuje nula nebo více celých bloků se samotným obsahem. Velikost každého souboru v archivu je uvedena přímo v hlavičce, takže po stažení hlavičky víme, kde bude začínat další soubor. Tar navíc umí přepínačem -R přidat do výpisu i čísla bloků na kterých soubory v archivu začínají.

Na základě těchto informací můžeme úlohu celkem rychle vyřešit. Začneme stahovat, několik sekund počkáme a pak stahování přerušíme. Necháme tar vypsat, co jsme to stáhli. Stahování pravděpodobně skončilo na začátku nějakého velkého souboru, takže je potřeba backup.tar natáhnout na tuto délku, aby se mohlo se stahováním pokračovat dalším souborem.

K tomu se hodí třeba obyčejné dd, které umí pomocí parametru seek vytvořit sparse file (výhodou je, že zaprvé nepotřebujeme skutečných 11 GB na disku a zadruhé se takovéto natažení souboru provede okamžitě; principiálně by samozřejmě fungovalo i vyplnění souboru třeba nulami). Poté, co je stažený archiv natažený, můžeme navázat stahováním dalšího souboru v archivu. Celý cyklus jde poměrně jednoduše nascriptovat.

Samozřejmě existuje i spousta dalších možností. Nabízí se třeba httpfs, které někteří řešitelé využili, ale potřebovalo několik úprav (jednu i kvůli tomu, že server neposílal úplně korektní hlavičky – což nebyl záměr, ale nedopatření). Potom také bylo potřeba taru přepínači říct, že soubor umožňuje seek a že se má číst jen po malých blocích (-nb 1).

Dále se dá použít nějaká knihovna pro http a tar a napsat si k tomu script třeba v pythonu. Případně si ručně dekódovat hlavičku v archivu a správné rozsahy pro stažení ručně dopočítat a poslat serveru v hlavičce Ranges.

Ať už se k obsahu archivu dostanete jakkoliv, nakonec byste měli koukat zhruba na následující:

$ tar tvf backup.tar
drwxr-xr-x root/root          0 2012-01-16 09:40 doc/
-rw-r--r-- root/root       1103 2012-01-16 09:40 doc/rfc748.txt.bz2
-rw-r--r-- root/root       6992 2012-01-16 09:40 doc/rfc2324.txt.bz2
-rw-r--r-- root/root       3755 2012-01-16 09:40 doc/rfc2549.txt.bz2
-rw-r--r-- root/root      87691 2012-01-16 09:40 doc/rfc2616.txt.bz2
-rw-r--r-- root/root         81 2012-01-16 09:40 doc/link.url
drwxr-xr-x root/root          0 2012-01-16 09:40 audio/
-rw-r--r-- root/root    1099860 2012-01-16 09:40 audio/tady-nic-neni.mp3
drwx------ root/root          0 2012-01-16 09:40 zaloha/
-r-------- root/root    9840420 2012-01-16 09:40 zaloha/private.encrypted.img
-r-------- root/root 1460657054 2012-01-16 09:40 zaloha/database.encrypted.img
-r-------- root/root 7145045329 2012-01-16 09:40 zaloha/home.encrypted.img
drwxrwxr-x root/root          0 2012-01-16 09:40 podrate/
lrwxrwxr-x root/root          0 2012-01-16 09:40 podrate/uloha1/ -> /home/podrate/ulohy/1/
lrwxrwxr-x root/root          0 2012-01-16 09:40 podrate/uloha2/ -> /home/podrate/ulohy/2/
lrwxrwxr-x root/root          0 2012-01-16 09:40 podrate/uloha3/ -> /home/podrate/ulohy/3/
lrwxrwxr-x root/root          0 2012-01-16 09:40 podrate/uloha4/ -> /home/podrate/ulohy/4/
lrwxrwxr-x root/root          0 2012-01-16 09:40 podrate/uloha5/ -> /home/podrate/ulohy/5/
lrwxrwxr-x root/root          0 2012-01-16 09:40 podrate/uloha6/ -> /home/podrate/ulohy/6/
lrwxrwxr-x root/root          0 2012-01-16 09:40 podrate/uloha7/ -> /home/podrate/ulohy/7/
drwxrwxr-x root/root          0 2012-01-16 09:40 podrate/uloha8/
l--------- root/root          0 2012-01-16 09:40 podrate/uloha8/heslo -> ../../dev/null
lrwxrwxr-x root/root          0 2012-01-16 09:40 podrate/uloha9/ -> /home/podrate/ulohy/9/
lrwxrwxr-x root/root          0 2012-01-16 09:40 podrate/uloha10/ -> /home/podrate/ulohy/10/
drwxr-xr-x root/root          0 2012-01-16 09:40 papers/
-rw-r--r-- root/root      78701 2012-01-16 09:40 papers/0x63.pdf
drwxrwxr-x root/root          0 2012-01-16 09:40 dev/
-rw-rw-rw- root/root 2346687901 2012-01-16 09:40 dev/zero
-rw-rw-rw- root/root        196 2012-01-16 09:40 dev/null
dr-x------ root/root          0 2012-01-16 09:40 top/
dr-x------ root/root          0 2012-01-16 09:40 top/secret/
-r-------- root/root  803128043 2012-01-16 09:40 top/secret/top-secret.dat
drwxrwxr-x root/root          0 2012-01-16 09:40 images/
-rw-rw-r-- root/root      12175 2012-01-16 09:40 images/podrate.png
-rw-rw-r-- root/root       9839 2012-01-16 09:40 images/niel.jpg

Soubor podrate/uloha8/heslo vypadá zajímavě, ještě je třeba si všimnout, že je to jen symlink mířící do dev/null, což je ale přes zavádějící jméno obyčejný soubor v archivu. V něm už bydlí png obrázek s heslem koherence.

Dalším zajímavým souborem je 0x63.pdf. Jméno převedené do desítkové soustavy dá 99, což je víc než nápadné. Pokud se zahloubáte do tohoto alchymistického výzkumu (anebo jej alespoň rychle prohlédnete), neměla by vám uniknout poznámka pod čarou s číslem 99 a textem really.

Vše další v archivu byl jen balast pro pobavení, zmatení, či jen vyplnění místa.

Zajímavosti

Našlo se dost řešitelů, kteří měli víc než malou trpělivost a vydrželi dlouhé hodiny čekat na stažení archivu. Konkrétně více než stovka spojení trvala více než hodinu a asi deset spojení trvalo přes 10 hodin.

Server kromě GET a HEAD s backup.tar na žádné jiné požadavky nereagoval jinak, než chybovou odpovědí. Nicméně hráči nás zásobovali různými zajímavými requesty. Nejčastější (po /favicon.ico) byl požadavek na /backup.tar.gz. Sice zajímavý nápad, ale tudy tentokrát cesta nevedla.

Dostali jsme spoustu "kafových" requestů, ale na ně bohužel server neuměl odpovědět. Neuměl odpovědět ani na DELETE /backup.tar který nám jeden hráč poslal, ale někteří z organizátorů mají neodolatelné sklony obdobnou funkcionalitu do některých příštích ročníků implementovat. :)

Mimo správného hesla robůtkovi přišlo několikrát matrix (vizte souvislost), spousta variací na "tady nic není", dvě žirafy a kupodivu také drak a zombie.

Úlohu vymyslel a zrealizoval Marble, inspirací mu byla jeho vlastní snaha dostat pár souborů ze svn repozitáře projektu Sintel, který byl tou dobou k dispozici pouze na http serveru jako tar archiv rozdělený na asi 500 souborů, každý o velikosti čtvrt giga.

Re: Po drátě 6: Řešení úlohy č. 8 playeeer1 (25. 1. 2012 - 15:47) Sbalit(1)
Ten zaznam tady-nic-neni.mp3 je dokonaly :). Jak jsem zoufale hledal heslo k posledni uloze, tak jsem to zkousel analyzovat, ale prekvapive jsem nic nenasel :).
Re: Po drátě 6: Řešení úlohy č. 8 MP (25. 1. 2012 - 18:43) Sbalit(3)
> asi deset spojení trvalo přes 10 hodin

Jo, ja na to pustil wget, prozkoumal prvnich par souboru a hodil terminal s wgetem do pozadi, pak jsem vymyslel reseni, pustil .... a asi o den a pul pozdeji jsem si vsiml toho zapomenuteho terminalu kde mezitim se timhle snecim tempem stahlo asi 120 MB :)
Re: Po drátě 6: Řešení úlohy č. 8 Drsnik (25. 1. 2012 - 20:13) Sbalit(2)
JJ wget a dd if=/dev/zero. Sparse fajlik by to malicko urychlil ale disky mame dnes velke a rychle. A ja si nemohl vzpomenout ze se tomu rika sparse. Vsechno hezky rucne, nakonec to nebylo o moc pomalejsi nez skript, nez bych dal dohromady ascii/deoktalizaci delky... Trosku me zklamal Midnight commander, ktery me l pronblemy s jukanim do fajliku nad 2^32 ale to vyresil dalsi dd -skip 0x200000000....
Re: Po drátě 6: Řešení úlohy č. 8 Zaboj Campula (25. 1. 2012 - 23:32) Sbalit(1)
On ten skript zase tak tezky nebyl, jeste ho mam schovany:

#!/bin/bash
offbeg=0
while true
do
offend=`expr $offbeg + 511`
nc backup.podrate.cz 9876 > out << NN
GET /backup.tar HTTP/1.1^M
Host: backup.podrate.cz:9876^M
Range: bytes=$offbeg-$offend^M
^M
NN

cat out | sed -e '1,9d' > out.tar
echo -n "BEG=$offbeg END=$offend "
X=`tar tvf out.tar 2>/dev/null | tail -1 `
echo $X
len=`echo $X | awk ' { print $3 } '`
if [ $len -eq 0 ]
then
offbeg=`expr 512 + $offbeg`
else
offbeg=`expr '(' $len - 1 ')' / 512 '*' 512 + 1024 + $offbeg`
fi
done