Proběhla hackerská soutěž Pwn2Own Ireland 2025. Celkově bylo vyplaceno 1 024 750 dolarů za 73 unikátních zranitelností nultého dne (0-day). Vítězný Summoning Team si odnesl 187 500 dolarů. Shrnutí po jednotlivých dnech na blogu Zero Day Initiative (1. den, 2. den a 3. den) a na YouTube.
Byl publikován říjnový přehled dění a novinek z vývoje Asahi Linuxu, tj. Linuxu pro Apple Silicon. Pracuje se na podpoře M3. Zanedlouho vyjde Fedora Asahi Remix 43. Vývojáře lze podpořit na Open Collective a GitHub Sponsors.
Iniciativa Open Device Partnership (ODP) nedávno představila projekt Patina. Jedná se o implementaci UEFI firmwaru v Rustu. Vývoj probíhá na GitHubu. Zdrojové kódy jsou k dispozici pod licencí Apache 2.0. Nejnovější verze Patiny je 13.0.0.
Obrovská poptávka po plynových turbínách zapříčinila, že datová centra začala používat v generátorech dodávajících energii pro provoz AI staré dobré proudové letecké motory, konvertované na plyn. Jejich výhodou je, že jsou menší, lehčí a lépe udržovatelné než jejich průmyslové protějšky. Proto jsou ideální pro dočasné nebo mobilní použití.
Typst byl vydán ve verzi 0.14. Jedná se o rozšiřitelný značkovací jazyk a překladač pro vytváření dokumentů včetně odborných textů s matematickými vzorci, diagramy či bibliografií.
Specialisté společnosti ESET zaznamenali útočnou kampaň, která cílí na uživatele a uživatelky v Česku a na Slovensku. Útočníci po telefonu zmanipulují oběť ke stažení falešné aplikace údajně od České národní banky (ČNB) nebo Národní banky Slovenska (NBS), přiložení platební karty k telefonu a zadání PINu. Malware poté v reálném čase přenese data z karty útočníkovi, který je bezkontaktně zneužije u bankomatu nebo na platebním terminálu.
V Ubuntu 25.10 byl balíček základních nástrojů gnu-coreutils nahrazen balíčkem rust-coreutils se základními nástroji přepsanými do Rustu. Ukázalo se, že nový "date" znefunkčnil automatickou aktualizaci. Pro obnovu je nutno balíček rust-coreutils manuálně aktualizovat.
VST 3 je nově pod licencí MIT. S verzí 3.8.0 proběhlo přelicencování zdrojových kódů z licencí "Proprietary Steinberg VST3 License" a "General Public License (GPL) Version 3". VST (Virtual Studio Technology, Wikipedie) je softwarové rozhraní pro komunikaci mezi hostitelským programem a zásuvnými moduly (pluginy), kde tyto moduly slouží ke generování a úpravě digitálního audio signálu.
Open source 3D herní a simulační engine Open 3D Engine (O3DE) byl vydán v nové verzi 25.10. Podrobný přehled novinek v poznámkách k vydání.
V Londýně probíhá dvoudenní Ubuntu Summit 25.10. Na programu je řada zajímavých přednášek. Zhlédnout je lze také na YouTube (23. 10. a 24. 10.).
message.bin.gz, po dekompresi s obsahem
1000110 1001100 1000001 1000111 1111011 1110010 1111010 1110111 1100001 101101 1110000 110010 1010000 1111001 101101 111001 110110 1010010 1111001 101101 1000110 1100100 1011010 1010101 1111101(mimochodem téměř všechny úlohy byly komprimované gzipem a ukázalo se, že je bezpečné je dekomprimovat -- nešlo tedy o situaci kdy by byl flag nějak schovaný v komprimovaném streamu, například v úmyslných neoptimalitách komprese) Jedná se o ASCII kde jsou vypuštěny úvodní nuly (většinou jedna, ale u znaků s kódem pod 64 dvě), stačí doplnit, převést na binárku a přečíst. Mně štvalo jak tohle není v shellu přímočaré, tak jsem si kdysi napsal blobutils (naprogramováno příšerně když jsem to ještě neuměl), co používají ostatní nevím.
$ zcat message.bin.gz | tr " " "\n"|sed -re "s/^/0/g"
*ručně edituje výstup*
$ cat a | blbithex | blhexbin
FLAG{rzwa-p2Py-96Ry-FdZU}
106 114 101 107 173 172 125 113 171 55 65 161 156 112 55 160 67 114 104 55 63 146 151 164 175Jsou to bajty v osmičkové soustavě. Po chvíli zápasu s tím jak v
bc funguje ibase a obase:
$ for x in $(for b in `zcat octopus.gz`; do echo "obase=10;ibase=8;$b" | bc; done ); do dechex $x; done|blhexbin
FLAG{zUKy-5qnJ-p7LD-3fit}
46 4c 41 47 7b 38 4d 56 58 2d 4c 68 38 6d 2d 74 4d 4d 49 2d 4b 38 73 69 7dTohle je přímo hexdump, stačí přečíst.
$ zcat foxtrot.gz | blhexbin
FLAG{8MVX-Lh8m-tMMI-K8si}
RkxBR3tTNXJyLXJDeHQtYW1ZWS03WDQ2fQ==Toto je base64, stačí dekódovat.
$ zcat textual.b64.gz |base64 -d
FLAG{S5rr-rCxt-amYY-7X46}
Challenge task : Prove you are a ROBOT by evaluating the acceptability of following items: [electric engine, drone swarm, sweet baby, love, mineral oil, lovely puppy, pretty children, hope]Podle instrukcí je potřeba poslat zpátky v GET parametru seznam 0 a 1 podle toho jestli věci v seznamu jsou nebo nejsou vhodné pro roboty. Těch itemů je celkem 16, proto uděláme několik requestů a všechny si je vypíšeme.
Challenge timeout (sec) : 2
$ for i in `seq -w 1 10`; do wget http://challenges.thecatch.cz/c2619b989b7ae5eaf6df8047e6893405/ -O samples$i.txt; done $ cat samples*|grep -oE "\[.+]" | tr -d "]" | tr "," "\n"|tr "[" " " | sed -re "s/^ //g" | sed -re "s/ $//g" | sort | uniq artificial intelligence automatic transmission cute kitty drone swarm electric engine fast CPU fear hope large hard drive love lovely puppy mineral oil pretty children resistor 10 Ohm sweet baby yumy foodNásledně jsem je ručně roztřídil do souborů
acc a unacc. Řešit to budeme kompletně v shellu protože proč ne.
rm jar.txt
wget --keep-session-cookies --save-cookies jar.txt -S http://challenges.thecatch.cz/c2619b989b7ae5eaf6df8047e6893405/ -O challenge.txt
s=`grep -oE "\[.+]" challenge.txt | tr -d "]" | tr "," "\n"|tr "[" " " | sed -re "s/^ //g" | sed -re "s/ $//g"`
>str
echo "$s" | while read line; do
if grep -q "$line" acc; then
echo -n 1 >> str
elif grep -q "$line" unacc; then
echo -n 0 >> str
else
echo "unk w $line"
echo -n 0 >> str
fi
done
wget --load-cookies jar.txt -S http://challenges.thecatch.cz/c2619b989b7ae5eaf6df8047e6893405/?answer=`cat str` -O outf.txt
$ cat outf.txt
FLAG{4FZC-Noax-arko-r0z5}
Challenge task : Return value of variable 'j' in equation (5j + 9k - 4g)/3 + 4j - 2k + 7g + (6j + 1k - 6g)/5 + (9j - 10k + 4g)/2 + (6j + 9k + 3g)/11 = 1089095, where k = 61640, g = 56913Naprasíme v sympy. Je potřeba nahradit implicitní násobení hvězdičkami (
Challenge timeout (sec) : 2
6j → 6*j) a známé proměnné zadanými hodnotami (k → 61640). Následně se aplikuje toto řešení ze stackoverflow a výsledek se odešle.
#!/usr/bin/env python3
from sympy.solvers import solve
from sympy import Symbol
from sympy.core.sympify import sympify
import os
os.system("wget --keep-session-cookies --save-cookies jar.txt -S http://challenges.thecatch.cz/70af21e71285ab0bc894ef84b6692ae1/ -O challenge.txt")
l = open("challenge.txt").readlines()[0].strip()
pcs = l.split("'")
tgtvar = pcs[1]
pcs = l.split(" ")
rest = pcs[10:]
eq = ""
i=0
while rest[i] != "where":
eq += rest[i]
i+=1
setv1 = rest[i+1]
arg1 = rest[i+3][:-1]
eq = eq.replace(setv1, "*"+arg1)
setv2 = rest[i+4]
arg2 = rest[i+6]
eq = eq.replace(setv2, "*"+arg2)[:-1]
eq = eq.replace(tgtvar, "*x")
print(eq)
sympy_eq = sympify("Eq(" + eq.replace("=", ",") + ")")
s = solve(sympy_eq)
print(s)
os.system("wget --load-cookies jar.txt -S http://challenges.thecatch.cz/70af21e71285ab0bc894ef84b6692ae1/?answer=%s"%s[0])
$ ./solve.py
(5*x+9*61640-4*56913)/3+4*x-2*61640+7*56913+(6*x+1*61640-6*56913)/5+(9*x-10*61640+4*56913)/2+(6*x+9*61640+3*56913)/11=1089095
[74658]
$ cat index.html\?answer\=74658
FLAG{jyST-xaHl-un3Z-EG3X}
50.0927061N, 14.3605981E 50.0997428N, 14.3746981E 50.0948308N, 14.3574061E 50.0945831N, 14.3564781E 50.0383203N, 14.6338128E 49.8498033N, 18.1607744E 50.0996294N, 14.3740758E 49.8301058N, 18.1658503E 50.1077264N, 14.3747211E 49.1845217N, 16.5903547E 50.0875092N, 14.3413444E 50.0997878N, 14.3749342E 49.8300331N, 18.1662311E 50.0927783N, 14.3610058E 49.1845217N, 16.5903547E 49.8303617N, 18.1649597E 50.0957778N, 14.3583369E 50.0945831N, 14.3564781E 49.8421903N, 18.1570325E 49.1845217N, 16.5903547E 49.8298600N, 18.1696319E 49.8420003N, 18.1582556E 50.0997428N, 14.3746981E 49.8420003N, 18.1582556E 50.0375364N, 14.6330322EJe jich 25 (délka flagu), souřadnice na místech kde má flag pomlčky jsou stejné, a jsou v Praze, v Brně a v Ostravě (což nepomohlo). Hint odkazuje na mapy.cz. Ukáže se, že je potřeba zjistit čísla orientační budov na daných souřadnicích, a to jsou hodnoty znaků v ASCII tabulce.
$1$4lUL$c/JvvfuMWNZyIh4lOJlBi.), který se mi nepodařilo vycrackovat, jednak je tam
tacacs-server key 7 0804545A1B18360300040203641B256C770272010355Hledání ukáže že to je nějaká zoufalá obfuskace hesla, v podstatě vyxorování s univerzálním klíčem. Náhodně nalezená stránka nám řekne že heslo je
ExtraStrong.Pa$$W0rd#. To se pak řekne wiresharkovému dissectoru (Preferences → Protocols → TACACS+) a když si pak dáme filtr tcp.port == 49 a proklikáme si pakety, tak tam někde je flag.
aircrack-ng vacuum_cleaner.pcap -w wordlist.txtale pokud máme přístup k GPU, tak bude rychlejší hashcat. Tomu je potřeba data předzpracovat pomocí programu
cap2hccapx z hashcat-utils.
$ cap2hccapx.bin vacuum_cleaner.pcap a.hccapxZískaný soubor pak můžeme dát hashcatu.
$ hashcat -m 2500 -a 0 a.hccapx Top2Billion-probable-v2.txtPoužil jsem svůj oblíbený Probable Wordlist. Heslo
Goodluck2 je na pozici kolem 15 milionů, což na GTX 1080Ti trvá asi půl minuty (450 kkey/s), na lowendovém notebooku (2 kkey/s) by to trvalo dvě hodiny. Kamarád reportoval že bylo podstatně výhodnější použít krátký wordlist a mutační pravidla která to velké písmeno na začátku a číslici na konci dají podstatně rychleji než po 15 milionech pokusů.
Heslo se následně zadá do Wiresharku (Preferences → Protocols → IEEE 802.11 → Decryption keys), přičemž je ve tvaru heslo:SSID (z hashcatu to vypadne jako SSID:heslo a já to samozřejmě zadal blbě a pak jsem dlouho zkoumal proč to nefunguje). Pak už vidíme DNS dotaz na _flag.example.com a v odpovědi flag.
Mimochodem neznáte nějakou službu hashcat-as-a-service pro lidi líné a bez hardwaru? Samozřejmě je možné si naprovisionovat VPSku s GPU z Amazon AWS nebo Google Cloudu, případně to dát spočítat na něco jako Vast.ai, ale kdo se o to má starat. Kdysi existoval CloudCracker, který byl neflexibilní a teď už láme jenom DES.
50�6'36.4693"N, 14�26'52.7475"E 62�3'52.6244"N, 14�22'3.22657"E 59�6'16.6773"N, 20�24'36.9470"E 56�7'11.2941"N, 14�24'17.2524"ENejdřív ho převedeme do UTF-8 protože znak ° je blbě
$ zcat drone_flight.gps.gz|recode iso-8859-1..utf8 > drone.utfa teď už stačí jenom napsat
$ gpsprune drone.utfa flag si přečíst.
Někteří si nepřečetli zadání, ze kterého vyplývá, že ty znaky na začátku jsou B-1084, a pak tápali, co je v daném fontu 0, B a 8.
5f43 0x5ePhotorec, binwalk ani hledání NTFS Alternate Data Streams nepřineslo nic zajímavého. Zprubujeme oddíly pomocí
kpartx -a seventh_element.dd a pak můžeme úplně všechno namountovat (/dev/mapper/loop0pX) a soubory si přečíst.
Napadne nás, že to je nějaká datová struktura, přičemž znaky na prvním řádku jsou hexa bajty odpovídající ASCII písmenkům a na druhém řádku je číslo oddílu na který se máme podívat dál. Tak si tu strukturu nakreslíme jako orientovaný graf (předpokládám, že soubory jsme si zkopírovali jako file1 až file128):
$ (echo "digraph{"; for i in `seq 1 128`; do tar=$(( $(hexdec `tail -n 1 file$i|cut -c 3-`) + 1 )); echo "file$i->file$tar;"; done; echo "}") > xx.dot
(tu +1 jsem tam napsal protože když číslujeme od nuly tak to nefunguje, resp. podle toho jak přesně to děláte tak vám to dokonce řekne WARNING{Indexing from 1? Are you pathetic human?})
pozn. soubor xx.dot nyní obsahuje něco takového, o Dotu a dalších nástrojích už chci delší dobu napsat článek:
digraph{
file1->file28;
file2->file110;
file3->file45;
file4->file101;
file5->file63;
file6->file69;
file7->file13;
file8->file86;
file9->file4;
Orientovaný graf zpracujeme Dotem:
$ dot -T png xx.dot > a.png
Tak řekněme že to prostě projdeme a tady je hned vidět v jakých dvou bodech dává smysl začít.
#!/usr/bin/env python3
import sys,os
def readfile(fname, mode="r"):
f = open(fname, mode)
d = f.readlines()
f.close()
return d
l=[]
fname = sys.argv[1]
while True:
#print("next: %s"%fname)
d = readfile(fname)
nf = int(d[1], 16)+1
print("%s %s %02x"%(fname,d[0].strip(),nf))
fname = "file%i"%nf
if fname in l:
break
l.append(fname)
$ ./graph.py file7|cut -d " " -f 2 | blhexbin
FLAG{tPJ4-idCH-GWlh-JjL8}
Tiskni
Sdílej:
#!/usr/bin/python
import sys
data = sys.argv[1]
key = sys.argv[2]
buckets = []
keyLen = len(key)
seq = [ None ] * keyLen
read = 0
chidx = 0
totalLen = 0
for chpos in range(0, 26):
found = True
while found:
found = True
ch = chr(ord('a')+chpos)
if ch not in key:
found = False
break
idx=key.index(ch)
k=list(key)
k[idx]='#'
key="".join(k)
seq[idx] = chidx+1
chidx +=1
totalLen += chidx
print("totalLen: "+str(totalLen))
print("dataLen: "+str(len(data)))
if totalLen < len(data):
repeats = len(data) / totalLen
seqLen = len(seq)
for j in range(0, int(repeats)-1):
for i in range(0, seqLen):
seq.append(seq[i])
bucket = 0
bucket_pos = 0
for c in data:
if bucket >= len(buckets):
buckets.append([ c ])
else:
buckets[bucket].append(c)
bucket_pos += 1
if bucket_pos >= seq[bucket]:
bucket += 1
bucket_pos = 0
if bucket >= len(seq):
bucket = 0
bucket_pos = 0
i = 0
c=1
for j in range(0, 100):
found = False
for i in range(0, len(seq)):
if j < len(buckets[i]):
if c % 2 == 0:
endch=" "
else:
endch=""
print(buckets[i][j], end=endch)
c+=1
else:
continue
print()
A wrapper roche.sh:
#!/bin/bash
data=`cat colonel_roche.encrypted`
keys=("monday" "monday" "monday" "monday" "monday" "monday" "monday" "monday")
offset=0
chunkSize=0
dataSize=`echo -n "$data"|wc -c`
keyIdx=0
while [ $offset -lt $dataSize ]; do
key=${keys[$keyIdx]}
chunkSize=0
for i in $(seq 1 $(echo -n $key|wc -c)); do
let chunkSize=$chunkSize+$i
done
#echo "chunkSize: $chunkSize"
workChunk=$(echo "$data"|tail -c +$(expr $offset + 1)|head -c $chunkSize)
echo "workChunk: $workChunk"
echo "key: $key"
if [ -z "$key" ]; then
break
fi
ANS="$ANS $(./roche.py $workChunk $key|grep -v Len)"
echo
let offset=$offset+$chunkSize
let keyIdx=$keyIdx+1
done
echo $ANS|xxd -r -ps
#!/usr/bin/python
import matplotlib.image as img
import numpy as np
import scipy.misc
from PIL import Image
mimg = Image.open("m.png")
cimg = Image.open("c.png")
m = np.array(mimg)
c = np.array(cimg)
mcsq = c * c * m
scipy.misc.imsave("mcsq.png", mcsq)
Tady byla trochu zrada, kdyz clovek pouzil matplotlib.image.imread, tak to normalizovalo data v obrazku na 0...1 (misto 0..255), takze to pak nevychazelo).