Hallo Forum,
ich bin gerade dabei eine Klasse für eine NTLM Autentifizierung zu bauen (leider gibt es sowas noch nicht auf php ebene). Und modntlm für Apache kann nicht mit Gruppen umgehen.
Dazu habe ich mir die Doku von http://davenport.sourceforge.net/ntml.htlm ausgedruck und gut durchgelesen.
Im allgemeinen bin ich gerade dabei die Type1 Nachricht vom Client zu lesen. In ihr sind von Position X bis Y die NTLM Flags versteckt, die in einem Bitfeld kodiert sind.
Um eine richtige Antwort auf die gelieferten Daten senden zu können muss ich diese Auswerten.
Das schaut dann so aus:
Der Komplette HEX-String
4e544c4d535350000100000007b208a2040004002e00000006000600280000000501280a0000000f4c4150544f50484f4d45
Das benötigte Teilstück (was ist dann durch $tmp = substr($hexmessage, 24, 8); ermittele):
07b208a2
In der Doku stehen die Definitionen folgendermassen betitelt.
Flag = 0x00000002 <=> NEOGATE_OEM
Leider kann ich damit nicht richtig umgehen... Ich verstehe nicht was ich mit den Daten machen soll?
So wie ich es bis jetzt verstanden habe ist der Wert 0x00000002 die Adresse wo das Bit gesetzt wird. Aber wie kann ich erkennen ob in dem Teilstring 07b208a2 welches Bit gesetzt ist?
Auf der php.net Seite habe ich unter den Bitoperatoren die folgende Funktion gefunden.
Aber wenn ich mit ihr wie hier geschildert Arbeite kommen irgendwie falsche werte raus, die so nicht stimmen können.
PHP-Quellcode:
Wobei ich die Konstanden wie folgt definiert habe:
Kann mir jemand helfen das Problem um zu setzten? Und kennt evtl. jemand eine sehr gut verständliches HowTo? Habe zwar schon mehrere zu dem Thema gelesen aber leider haben diese nur einen Knoten in meinem Hirn hinterlassen *g*
Gruß,
Thomas
ich bin gerade dabei eine Klasse für eine NTLM Autentifizierung zu bauen (leider gibt es sowas noch nicht auf php ebene). Und modntlm für Apache kann nicht mit Gruppen umgehen.
Dazu habe ich mir die Doku von http://davenport.sourceforge.net/ntml.htlm ausgedruck und gut durchgelesen.
Im allgemeinen bin ich gerade dabei die Type1 Nachricht vom Client zu lesen. In ihr sind von Position X bis Y die NTLM Flags versteckt, die in einem Bitfeld kodiert sind.
Um eine richtige Antwort auf die gelieferten Daten senden zu können muss ich diese Auswerten.
Das schaut dann so aus:
Der Komplette HEX-String
4e544c4d535350000100000007b208a2040004002e00000006000600280000000501280a0000000f4c4150544f50484f4d45
Das benötigte Teilstück (was ist dann durch $tmp = substr($hexmessage, 24, 8); ermittele):
07b208a2
In der Doku stehen die Definitionen folgendermassen betitelt.
Flag = 0x00000002 <=> NEOGATE_OEM
Leider kann ich damit nicht richtig umgehen... Ich verstehe nicht was ich mit den Daten machen soll?
So wie ich es bis jetzt verstanden habe ist der Wert 0x00000002 die Adresse wo das Bit gesetzt wird. Aber wie kann ich erkennen ob in dem Teilstring 07b208a2 welches Bit gesetzt ist?
Auf der php.net Seite habe ich unter den Bitoperatoren die folgende Funktion gefunden.
PHP-Code:
<?php
function readbit($val, $bit)
{
return ($val&(0+('0x'.dechex(1<<($bit-1)))))?'1':'0';
}
?>
PHP-Quellcode:
PHP-Code:
<?php
function Type1Message()
{
$message = $this->decodeMessage();
$hexmessage = bin2hex($message);
// NTLM Flags
$tmp = substr($hexmessage, 24, 8);
$unicode = $this->readbit($tmp, NEOGATE_UNICODE);
$oem = $this->readbit($tmp, NEOGATE_OEM);
$target = $this->readbit($tmp, REQUEST_TARGET);
$sign = $this->readbit($tmp, NEOGATE_SIGN);
$seal = $this->readbit($tmp, NEOGATE_SEAL);
$datagram = $this->readbit($tmp, NEOGATE_DATAGRAM_STYLE);
$lmkey = $this->readbit($tmp, NEOGATE_LAN_MANAGER_KEY);
$ntlm = $this->readbit($tmp, NEOGATE_NTLM);
$domain = $this->readbit($tmp, NEOGATE_DOMAIN_SUPPLIED);
$workstation = $this->readbit($tmp, NEOGATE_WORKSTATION_SUPPLIED);
$localcall = $this->readbit($tmp, NEOGATE_LOCAL_CALL);
$always_sign = $this->readbit($tmp, NEOGATE_NEOGATE_ALWAYS_SIGN);
$typeDomain = $this->readbit($tmp, TARGET_TYPE_DOMAIN);
$typeServer = $this->readbit($tmp, TARGET_TYPE_SERVER);
$typeShare = $this->readbit($tmp, TARGET_TYPE_SHARE);
$ntlm2 = $this->readbit($tmp, NEOGATE_NTLM2_KEY);
$init_response = $this->readbit($tmp, REQUEST_INIT_RESPONSE);
$accept_response = $this->readbit($tmp, REQUEST_ACCEPT_RESPONSE);
$session_key = $this->readbit($tmp, REQUEST_NON_NT_SESSION_KEY);
$info = $this->readbit($tmp, NEOGATE_TARGET_INFO);
$Enc128 = $this->readbit($tmp, NEOGATE_128);
$exchange = $this->readbit($tmp, NEOGATE_KEY_EXCHANGE);
$Enc56 = $this->readbit($tmp, NEOGATE_56);
echo "NEOGATE_UNICODE = ".$unicode."<br>\n";
echo "NEOGATE_OEM = ".$oem."<br>\n";
echo "REQUEST_TARGET = ".$target."<br>\n";
echo "NEOGATE_SIGN = ".$sign."<br>\n";
echo "NEOGATE_SEAL = ".$seal."<br>\n";
echo "NEOGATE_DATAGRAM_STYLE = ".$datagram."<br>\n";
echo "NEOGATE_LAN_MANAGER_KEY = ".$lmkey."<br>\n";
echo "NEOGATE_NTLM = ".$ntlm."<br>\n";
echo "NEOGATE_DOMAIN_SUPPLIED = ".$domain."<br>\n";
echo "NEOGATE_WORKSTATION_SUPPLIED = ".$workstation."<br>\n";
echo "NEOGATE_LOCAL_CALL = ".$localcall."<br>\n";
echo "NEOGATE_NEOGATE_ALWAYS_SIGN = ".$always_sign."<br>\n";
echo "TARGET_TYPE_DOMAIN = ".$typeDomain."<br>\n";
echo "TARGET_TYPE_SERVER = ".$typeServer."<br>\n";
echo "TARGET_TYPE_SHARE = ".$typeShare."<br>\n";
echo "NEOGATE_NTLM2_KEY = ".$ntlm2."<br>\n";
echo "REQUEST_INIT_RESPONSE = ".$workstation."<br>\n";
echo "REQUEST_ACCEPT_RESPONSE = ".$accept_response."<br>\n";
echo "REQUEST_NON_NT_SESSION_KEY = ".$session_key."<br>\n";
echo "NEOGATE_TARGET_INFO = ".$info."<br>\n";
echo "NEOGATE_128 = ".$Enc128."<br>\n";
echo "NEOGATE_KEY_EXCHANGE = ".$exchange."<br>\n";
echo "NEOGATE_56 = ".$Enc56."<br>\n";
}
?>
PHP-Code:
<?php
// NTLM Flags
define("NEOGATE_UNICODE", "0x00000001");
define("NEOGATE_OEM", "0x00000002");
define("REQUEST_TARGET", "0x00000004");
define("NEOGATE_SIGN", "0x00000010");
define("NEOGATE_SEAL", "0x00000020");
define("NEOGATE_DATAGRAM_STYLE", "0x00000040");
define("NEOGATE_LAN_MANAGER_KEY", "0x00000080");
define("NEOGATE_NTLM", "0x00000200");
define("NEOGATE_DOMAIN_SUPPLIED", "0x00001000");
define("NEOGATE_WORKSTATION_SUPPLIED", "0x00002000");
define("NEOGATE_LOCAL_CALL", "0x00004000");
define("NEOGATE_NEOGATE_ALWAYS_SIGN", "0x00008000");
define("TARGET_TYPE_DOMAIN", "0x00010000");
define("TARGET_TYPE_SERVER", "0x00020000");
define("TARGET_TYPE_SHARE", "0x00040000");
define("NEOGATE_NTLM2_KEY", "0x00080000");
define("REQUEST_INIT_RESPONSE", "0x00100000");
define("REQUEST_ACCEPT_RESPONSE", "0x00200000");
define("REQUEST_NON_NT_SESSION_KEY", "0x00400000");
define("NEOGATE_TARGET_INFO", "0x00800000");
define("NEOGATE_128", "0x20000000");
define("NEOGATE_KEY_EXCHANGE", "0x40000000");
define("NEOGATE_56", "0x80000000");
?>
Gruß,
Thomas
Kommentar