Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Cześć
Po aferze związanej z trojanem ebury, zrobiłem sobie skrypta, który pokazuje, co aktualnie zachowuje się podobnie do ebury, czyli tworzy gniazdo ipc z uprawnieniami 666.
W wersji lamerskiej, z użyciem grepa:
for idshm in `ipcs -m | awk '$4 == "666" { print $2 }'`; do ipcs -p | egrep ^$idshm | awk '{print $3}'| while read line; do ls -l /proc/$line/exe; done; done;
I pokazuje strasznego backdoora:
lrwxrwxrwx 1 pacjent proc 0 04-27 12:45 /proc/4685/exe -> /opt/bin/skype42013 lrwxrwxrwx 1 pacjent proc 0 04-27 12:45 /proc/4685/exe -> /opt/bin/skype42013
:D
Chciałem jednak troszkę "odlamerować" skrypta i wywalić grepa, a porównanie zmiennej zrobić w samym awk.
I tu mały problem:
for idshm in `ipcs -m | awk '$4 == "666" { print $2 }'`; do ipcs -p |awk '$1 == "$idshm" {print $3}'| while read line; do ls -l /proc/$line/exe; done; done;
i żadnych wyników.
Krotko pisząc, zadeklarowaną w pierwszej funkcji zmienną $idshm, grep rozpoznaje bez problemu, awk natomiast zachowuje się, jakby jej nie było w ogóle.
Cała różnica w działającym i nie działającym kawałku wygląda tak:
ipcs -p | egrep ^$idshm | awk '{print $3}'
dziala, a ten
ipcs -p |awk '$1 == "$idshm" {print $3}'
nie.
Jak prawidłowo wpisać zmienną $idshm do tego awka, żeby wyniki były jednakowe?
Wersja AWK:
sys-apps/gawk-4.0.2
Pozdro
;-)
Ostatnio edytowany przez Jacekalex (2014-04-27 19:30:05)
Offline
echo raz | awk -v AA=dwa '{print $1 " " AA}'
Offline
?
Dziękuję za odpowiedź, ale jakoś nie mogę ożenić odpowiedzi z pytaniem.
Chodzi o zastąpienie grepa czyli wyświetlenie pola $3 tylko, jeśli $1 równa się zmiennej $idshm zadeklarowanej w pierwszej funckji.
Tylko problem polega na tym, że awk w ogóle nie dopasowuje niczego, jak mu dam tą zmienną, choć moim zdaniem powinien.
Jeśli natomiast zamiast zmiennej ma liczbę, to dopasowanie warunkowe działa bez problemu.
Offline
To przyjrzyj się fladze -v.
Offline
azhag napisał(-a):
To przyjrzyj się fladze -v.
Teraz się odezwał ;)
for idshm in `ipcs -m | awk '$4 == "666" { print $2 }'`; do ipcs -p |awk -v '$1 == "$idshm" {print $3}'| while read line; do ls -l /proc/$line/exe; done; done; awk: fatalny błąd: `$1 ' nie jest dozwoloną nazwą zmiennej awk: fatalny błąd: `$1 ' nie jest dozwoloną nazwą zmiennej
Zawiadomił mnie o rzeczy oczywistej, $1 nie jest flagą zmiennej, tylko polem, które potrzeba porównać ze zmienną $idshm, która powstaje we wcześniejszej pętli for.
Czyli, ze tą zmienną trzeba jakoś inaczej wpisać, tylko jak.
Zmienna idshm w każdym przejściu zawiera liczbę, i chodzi o porównanie pola $1 z liczbą zawartą w zmiennej $idshm, i wypisanie pola $3, jeśli warunek $1 == "$idshm" jest spełniony.
Ostatnio edytowany przez Jacekalex (2014-04-27 18:56:55)
Offline
Bo ja wiem, może tak jak pokazałem w pierwszym poście?
Offline
azhag napisał(-a):
Kod:
echo raz | awk -v AA=dwa '{print $1 " " AA}'
Pokazałeś, jak się przerabia tekst, a mnie chodzi o stworzenie warunku.
Jeśli zamiast $idshm daję liczbę, to działa, a jak daję zmienną zawierającą liczbę, to wali błędem.
Pojęcia nie mam, dlaczego.
Obrazowo wygląda to tak:
echo $idshm 2555924 ipcs -p |awk '$1 == "2555924" {print $3}' 4685 #jest wynik ipcs -p |awk -v '$1 == "2555924" {print $3}' awk: fatalny błąd: `$1 ' nie jest dozwoloną nazwą zmiennej ipcs -p |awk '$1 == "$idshm" {print $3}' #brak wyniku ipcs -p |awk -v '$1 == "$idshm" {print $3}' awk: fatalny błąd: `$1 ' nie jest dozwoloną nazwą zmiennej
Reasumując, czuję się jak w tym kawale, gdzie Masztalski w kiblu (buka z latryną przy ogródku piwnym) zgubił sztuczną szczękę.
Coś mi się zdaje, że grep będzie musiał wystarczyć, chyba, że całość przeteleportuję na perla, choć perl w takim przypadku, to jak z armaty do wróbla. :D
EDIT:
najtrudniej znaleźć najprostsze rozwiązanie:
ipcs -p |awk -v IDSHM=$idshm '$1==IDSHM {print $3}' 4685
Dziękuję
PS:
Całość skrypta:
#!/bin/bash for idshm in `ipcs -m | awk '$4 == "666" { print $2 }'`; do ipcs -p |awk -v IDSHM=$idshm '$1==IDSHM {print $3}'| while read line; do ls -l /proc/$line/exe; done; done;
Pozdro
;-)
Ostatnio edytowany przez Jacekalex (2014-04-27 19:34:22)
Offline
Jacekalex napisał(-a):
azhag napisał(-a):
Kod:
echo raz | awk -v AA=dwa '{print $1 " " AA}'Pokazałeś, jak się przerabia tekst, a mnie chodzi o stworzenie warunku.
Warunek już miałeś (poza faktem, że źle korzystałeś ze zmiennej), ja pokazałem jak się przekazuje zmienne do awka właśnie.
Offline
Ok, po prostu chwilkę trwało, zanim wyczaiłem, co jest grane.
Zdziwiło mnie to o tyle, że jak się odpala perla w skrypcie basha, to ten przyjmuje zmienne przez ARGV[x], i można je od razu wywołać,
grep łapie od razu, a awk zawsze uważalem za niemal integralną część powłoki, dlatego ta cecha awk mnie mocno zdziwiła.
Rzadko mam do czynienia z AWK, bo powyżej 5 linijek funkcji zazwyczaj biorę od razu Perla.
Tu się potknąłem na takiej banalnej rzeczy, której nawet w dokumentacji ciężko wyczesać, bo AWK ma 1/50 możliwości Perla, ale podobnej długości dokumentację dotyczącą podstawowych funkcji. ;)
W każdym razie już chodzi tak, jak miało chodzić.
Żeby było śmieszniej, co chwila inny program ma perm 666 w ipc,
np Vlc-2.1.2, Skype-4.2.13, ciekawe, co będzie następne. :D
Bać się nie ma czego, na takie dziury mam np:
CONFIG_GRKERNSEC_HARDEN_IPC=y
Ale po prostu jestem ciekaw, jakie najgroźniejsze błędy można znaleźć w różnych programach.
Pozdro
;-)
Ostatnio edytowany przez Jacekalex (2014-05-08 00:32:26)
Offline
Strony: 1