Hilfe bei Shellscript (findet den Fehler ..bitte)

Hi, ich arbeite seit kurzen an einem Shellscript, habe auch erst seit kurzen angefangen mich näher mit Programmieren zu beschäftigen. Was das Script machen soll seht ihr selbst. Ich möchte im Vorraus, ausdrücklich darauf hinweisen, dass ich kein Interesse habe, das Script in der freien Wildbahn auszuprobieren. Es geht mir darum die Arbeitsweise der großen "Vorbilder" (OWASP ZAP, W3af, usw.) und somit auch die Syntax der jeweiligen Sprachen besser zu verstehen (ich denke da ist shellscripten ein guter Einstieg.. oder?) Wie gesagt ich bin blutige Anfängerin beim Programmieren und hoffe ihr könnt mir weiterhelfen. Beim Ausführen im Terminal kommt keine Fehlermeldung. Das Script beendet sich nach der ersten Eingabe, also vermute ich mal der Fehler ist im while/if Gewirr versteckt. Wahrscheinlich sticht er euch sofort ins Auge. Hoffe ihr könnt mir helfen. Jeder Anfang ist schwer.

Hier der Code:

Code:
#!/bin/bash

tput bold

clear
echo
echo "----------------------------------------------------------"
echo "|  Simple tool for testing my webserver"
echo "|"
echo "|"
echo "|"
echo "|"
echo "|"
echo "|"
echo "|-  1. URL"
echo "|-  2. HELP"
echo "----------------------------------------------------------"
echo
echo
echo
echo "Wuz up?"
echo
printf "> " $jo
read jo

    while [ "jo" == "1" ]; do
        clear
        printf "URL: " $url
        read url


        echo
        echo "----------------------------------------------------------"
        echo
        echo
        curl $url"/index.php?arg=1; phpinfo()"
        firefox $url"/index.php?arg=1; phpinfo()"
        echo
        echo "[+] Wait for browser"
        echo
        echo "-----------------------------------------------------------"
    done


    while [ "jo" == "2" ]; do
        clear
        echo
        echo "-----------------------------------------------------------"
        echo
        echo
        echo "Just type the vulnerable URL like testsite.com/index.php?page=contact.php"
        echo
        echo "For more information about code injection see: https://www.owasp.org/index.php/Code_Injection"
        echo
        echo
        echo
        echo "What up next? (B)ack or (e)xit?"
        echo

        printf "> " $jo2
        read jo2

            if [ "jo2" == "B" ]
              then
                      bash /root/Desktop/nameofthisthisscript.sh

            elif [ "jo2" == "e" ]
              then
                exit
            fi

        done
 
Zuletzt bearbeitet:
Nicht, dass ich ein Fan von Bash wäre (oder es gar zu meinen Lieblingssprachen zählen würde).
Variable Substitution
The only times a variable appears "naked" -- without the $ prefix -- is when declared or assigned, when unset, when exported, in an arithmetic expression within double parentheses (( ... )), or in the special case of a variable representing a signal (see Example 32-5).
Sprich:
Code:
"$jo" == "foo"
schreiben, sonst kann der Interpreter nicht zwischen dem String "jo" und der Variablen $jo unterscheiden ;)
 
Danke dir CDW schonmal für die schnelle Hilfe. :)

Also das der Interpreter nicht zwischen String und Variable unterscheiden kann klingt logisch, aber wie soll ich
Code:
"$jo" == "foo"
verstehen? An welche Stelle soll das hinzugefügt werden, bzw. was soll genau geändert werden? Ist das nicht ein neue Variable ("foo") die vor der Eingabe (printf/read) stehen muss? Den Link (4.1. Variable Substitution) habe ich mir angeschaut kann jedoch nicht nachvollziehen was ich wie ändern soll. Wie im Example 32-5. Trapping at exit angegeben müssen die Variablen vorher bestimmt werden. Das habe ich probiert bekomme aber die Fehlermeldung, dass das Kommando nicht gefunden wurde. :/ Ein Code Snippet als Beispiel wäre nett.

Ps: Ja, ich denke mir auch das ich mit Bash, früher oder später, nicht sehr weit kommen werde. Habe mir die anderen Sprachen auch schon angeschaut, bin jedoch nie sehr weit gekommen da mir die Zeit dafür gefehlt hat. Kann mich nur noch daran erinnern, dass ich bei Python immer an Symikolons gescheitert bin, die irgendwo im Script gefehlt haben. Ruby und Perl sahen nicht ganz so schwer aus. Und Lua klingt auch sehr interessant. Ich denke da an Nmap.. es gibt eine sehr interessante Präsentation von Fyodor und David Fifield wo letzterer sehr eindrücksvoll demonstriert was mit wenigen (nachvollziehbaren) Zeilen Code in LUA möglich ist. Ich weiß nicht ob ich die Videos hier verlinken darf.

Also wenn du oder ihr mir zeigen könntet wie das Script in z.B. Ruby aussehen würde könnte ich mich eventuell in die Syntax reinfuchsen und in Ruby weitermachen. So könnte ich das Script später auch als auxiliary modul in Metasploit einbinden. Versteht mich nicht falsch, anders habe ich es mit Bash und damals Batch auch nicht gemacht. Ich habe mir Beispiele angeguckt, versucht die Syntax, also die Logik zu verstehen und hab angefangen selber einfache Programme zu schreiben die mir manches Arbeiten erleichterten.
Von mir aus können wir auch die Funktion im Script ändern.. es muss ja keine code injection sein, von mir aus ein dir bruter für den Anfang oder Ähnliches. Ich möchte weder Ärger mit den Mods bekommen noch das Forum in ein falsches Licht rücken.
 
Zuletzt bearbeitet:
Code:
printf "> " $jo
read jo

    while [ "jo" == "1" ]; do

Es geht um den Teil. Wenn du den Inhalt der Variable überprüfen willst, dann darfst du den
a) Nicht als String mit "" angeben
b) Ein $ Zeichen voranstellen.

Code:
printf "> " $jo
read jo

    while [ $jo == "1" ]; do
 
Yes! Das war der Fehler. Jetzt hab ich es auch verstanden. Vielen Dank Tsjuder!

Und meinst du/ihr es wäre möglich mir noch zu zeigen wie das Script in Ruby aussehen würde?
 
Ungetestet:
Code:
puts
puts "----------------------------------------------------------"
puts "|  Simple tool for testing my webserver"
puts "|"
puts "|"
puts "|"
puts "|"
puts "|"
puts "|"
puts "|-  1. URL"
puts "|-  2. HELP"
puts "----------------------------------------------------------"
puts
puts
puts
puts "Wuz up?"
puts
print "> "
jo = gets.chomp

    while jo == "1" do
        print "URL: "
        url = gets.chomp


        puts
        puts "----------------------------------------------------------"
        puts
        puts
        exec("curl #{url}\"/index.php?arg=1; phpinfo()\"")
        exec("firefox #{url}\"/index.php?arg=1; phpinfo()\"")
        puts
        puts "[+] Wait for browser"
        puts
        puts "-----------------------------------------------------------"
    end

Kann auch sein, dass die \" nach #{url} vorgezogen werden müssen. Habe beide Programme nicht installiert und kann es daher nicht testen.
 
Ja danke Tsjuder curl funktioniert, aber Firefox/Iceweasel funktioniert nicht. Auch mit
Code:
exec("firefox \"#{url}/index.php?arg=1; phpinfo()\"")
hat es nicht funktioniert. Es kam aber auch keine Fehlermeldung. So hast du das doch gemeint mit vorziehen oder?

Der Text nach exec, also nachdem curl ausgeführt wird, wird nicht angezeigt. Zugegeben das ist nur ein Schönheitsfehler, aber wie kann man das lösen?

Vielen Dank nochmal. Du hilfst mir wirklich weiter. Hätte nicht gedacht, dass das in einem Forum so gut funktionert. :)
 
Zuletzt bearbeitet:
Es geht um den Teil.
Jep, danke - irgendwie ist in meinem Post der eigentliche Codeabschnitt, der korrigiert werden sollte, abhanden gekommen.

a) Nicht als String mit "" angeben
Nope - sowohl $jo wie auch "$jo" sollten valide sein - die Version mit "" hat den Vorteil, dass das Script auch bei einer Leereingabe (z.B Enter) funktioniert und nicht einen Syntaxfehler raushaut, weil dann irgendwie die Variable "nicht vorhanden" ist ;)
als Demo ein 1-Zeiler:
Code:
[CDW@highlander-jr ~]$ read jo; if [ $jo == "1" ] ; then echo "ho"; fi
k
[CDW@highlander-jr ~]$ read jo; if [ $jo == "1" ] ; then echo "ho"; fi
<hier wurde einfach Enter gedrückt>
bash: [: ==: unary operator expected
 
Im Skript sollte man die Pfade zu den Programmen immer vollständig angeben. Ausserdem würde ich Backticks anstelle von exec()-Calls empfehlen, damit du ggf. Meldungen vom Programm auswerten/anzeigen kannst.

Code:
cmd = "/usr/bin/firefox \"#{url}/index.php?arg=1; phpinfo()\""
output = `#{cmd}`
puts output

Vermutlich musst du den Pfad zum Firefox noch anpassen.
 
Also das der Interpreter nicht zwischen String und Variable unterscheiden kann klingt logisch, aber wie soll ich
Code:
"$jo" == "foo"
verstehen?
Ja, sorry, der Codeabschnitt, der korrigiert werden sollte, hat es irgendwie nicht in das Posting hineingeschafft ;)
Ist das nicht ein neue Variable ("foo")
"foo" ist ein mehr oder weniger geläufiger "Beispielbezeichner"/Platzhalter (Foobar - Wikipedia, the free encyclopedia).

PS/Edit: mit "bin kein Fan von Bash" meinte ich eigentlich meine recht bescheidene Kenntnisse (für ein paar Zeilen reicht es aus - mehr aber auch nicht, vor allem nicht für die ganzen Bash-spezifischen Erweiterungen) ;)
 
Zuletzt bearbeitet:
Danke Bitmuncher, das funktioniert jetzt auch. Und ihr helft wirklich schnell. Das ist super. Danke nochmal. :)

Wie komme ich jetzt zum Help Unterpunkt und wieder zurück ins menu?
Habe es so probiert:

Code:
while jo == "2" do
        puts
        puts 
        puts "-----------------------------------------------------------"
        puts
        puts
        puts "Just type the vulnerable URL like testsite.com/index.php?page=contact.php"
        puts
        puts "For more information about code injection see: https://www.owasp.org/index.php/Code_Injection"
        puts
        puts
        puts
        puts "What up next? (B)ack or (e)xit?"
        puts
        print "> "
        wuzup = gets.chomp
        while wuzup == "B" do
                ruby /root/Desktop/nameofthisscript.rb

        while wuzup == "e" do
                exit
        end
end

(Muss ich dann trotzdem cmd = ruby "/root/Desktop/nameofthisscript.rb" nehmen?)

Dann kommt (natürlich) die Fehlermeldung:
Code:
code_injection_tool.rb:55: unknown regexp options - Dktp
code_injection_tool.rb:60: syntax error, unexpected $end, expecting keyword_end
 
Zuletzt bearbeitet:
Was mir gerade noch auffällt...

Du wirst die URL, die du Firefox übergibst in einfache Anführungszeichen packen müssen, nicht in doppelte, weil sonst die ausführende Shell Sonderzeichen wie das Fragezeichen oder Und-Zeichen versucht im Shell-Kontext zu interpretieren. Schliesslich wird beim Ausführen eines Befehls durch einen Interpreter im Hintergrund immer eine Shell gestartet, die die Ausführung übernimmt.
 
Wie meinst du das bitmuncher? Der Request sieht in Ordnung aus:
Code:
The requested URL /index.php?arg=1;%20phpinfo() was not found on this server
Also hier sind keine überflüssigen Sonderzeichen erkennbar. Der Request stimmt. Wie meinst du das mit der Shell. Wird das im Hintergrund in einer neuen Shell ausgeführt? (Stelle ich mir performance-technisch bei komplexeren Anwendungen schwierig vor.)

Meinst du das so:

Code:
cmd = "/usr/bin/firefox \#{url}/index.php?arg=1; phpinfo()\"

?
 
Wie meinst du das bitmuncher? Der Request sieht in Ordnung aus:
Code:
The requested URL /index.php?arg=1;%20phpinfo() was not found on this server
Also hier sind keine überflüssigen Sonderzeichen erkennbar. Der Request stimmt. Wie meinst du das mit der Shell. Wird das im Hintergrund in einer neuen Shell ausgeführt? (Stelle ich mir performance-technisch bei komplexeren Anwendungen schwierig vor.)

Meinst du das so:

Code:
cmd = "/usr/bin/firefox \#{url}/index.php?arg=1; phpinfo()\"

?

In dem Fall hast du Glück, dass es Ruby ist und bei dir vermutlich eine Default-Installation vorliegt. Ruby verwendet nämlich die sh und nicht die bash um Befehle auszuführen. In anderen Skriptsprachen wird aber gern auch mal die bash direkt verwendet. Und es gibt Systeme, auf denen /bin/sh ein Link auf /bin/bash ist. Die Bash würde versuchen den String zu interpretieren sobald darin Sonderzeichen vorkommen.

Aus Sicht der Performance sind Skript-Sprachen für komplexere Anwendungen aber eh nicht geeignet. Schon das ständige Forken von Prozessen durch Aufrufe von externen Programmen sowie das Interpretieren des Codes während der Laufzeit oder beim Start sind Performance-Killer. Wenn man auf Performance achten will oder muss, sollte man zumindest Aufrufe an externe Programme meiden und z.B. lieber curl-Libraries anstelle von Firefox-Aufrufen verwenden. Bei Ruby wären das OpenURI oder Curb.
 
In dem Fall hast du Glück, dass es Ruby ist und bei dir vermutlich eine Default-Installation vorliegt. Ruby verwendet nämlich die sh und nicht die bash um Befehle auszuführen.

Wobei ich an dieser Stelle dezent für die Verwendung der klassischen bourne shell Werbung machen möchte.
 
Zurück
Oben