source: trunk/CrypPlugins/ManInTheMiddle/ManInTHeMiddle.cs @ 812

Last change on this file since 812 was 812, checked in by Matthäus Wander, 12 years ago

minor changes (assembly version etc.)

File size: 15.1 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Cryptool.PluginBase;
6using Cryptool.PluginBase.IO;
7using Cryptool.PluginBase.Miscellaneous;
8using System.Xml;
9using System.Xml.Schema;
10using System.Web;
11using System.Web.Services.Description;
12using System.Web.Services.Protocols;
13using System.Data;
14using System.IO;
15using System.ComponentModel;
16using System.Security.Cryptography;
17using System.Security.Cryptography.Xml;
18using System.Windows.Controls;
19using System.Collections;
20using System.Windows.Threading;
21using System.Threading;
22
23namespace ManInTheMiddle
24{
25    [Author("Jan Bernhardt", "jan_bernhardt@gmx.de", "Uni Siegen", "http://www.uni-siegen.de")]
26    [PluginInfo(false, "ManInTheMiddle", "Represents a Man in the middle", "", "ManInTheMiddle/ManInTheMiddleIcon.png")]
27 
28    public class ManInTHeMiddle:IThroughput
29    {
30
31      private ISettings settings = new ManInTheMiddleSettings();
32        private XmlDocument inputSoap;
33        private XmlDocument outputSoap;
34        public XmlDocument inputAnswer,wsdl,soap;
35        private MitmPresentation presentation;
36        private bool wrapper,send;
37       
38
39        public ManInTHeMiddle()
40        {
41            presentation = new MitmPresentation(this);
42            outputSoap = null;
43            this.PropertyChanged += new PropertyChangedEventHandler(ManInTHeMiddle_PropertyChanged);
44            settings.PropertyChanged +=new PropertyChangedEventHandler(settings_PropertyChanged);
45            wsdl = null;
46            send = false;
47            mySettings.Soap = "";
48         
49        }
50
51        void ManInTHeMiddle_PropertyChanged(object sender, PropertyChangedEventArgs e)
52        {
53            ManInTHeMiddle s = (ManInTHeMiddle)sender;
54            switch (e.PropertyName)
55            {
56                case "InputString":
57                    //presentation.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
58                    //{
59                    //TreeViewItem item = new TreeViewItem();
60                    //XmlNode node = (XmlNode)inputSoap.DocumentElement;
61                    //TextBlock elem1 = new TextBlock();
62                    //elem1.Text = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>";
63                    //StackPanel panel = new StackPanel();
64                    //panel.Children.Add(elem1);
65                    //item.Header = panel;
66                    //presentation.CopyXmlToTreeView(node, ref item);
67                    //presentation.treeView.Items.Clear();
68                    //item.IsExpanded = true;
69                    //presentation.treeView.Items.Add(item);
70                    //}, null);
71                    break;
72            }
73        }
74
75        public bool checkSecurityHeader()
76        {
77            bool securityheader = false;
78            XmlNodeList list =  outputSoap.GetElementsByTagName("wsse:Security");
79            if (!(list.Count == 0))
80            {
81                securityheader = true;
82            }
83            return securityheader;
84        }
85
86        public void wrapperAttackOnBody()
87        {
88            if (!checkSecurityHeader())
89            {
90                outputSoap.GetElementsByTagName("s:Envelope")[0].RemoveChild(outputSoap.GetElementsByTagName("s:Body")[0]);
91                outputSoap.GetElementsByTagName("s:Envelope")[0].AppendChild(outputSoap.ImportNode(soap.GetElementsByTagName("s:Body")[0],true));
92            }
93            else 
94            {
95                XmlNode wrapperElement = outputSoap.CreateElement("TheWrapper");
96                outputSoap.GetElementsByTagName("s:Header")[0].AppendChild(wrapperElement);
97                wrapperElement.AppendChild(outputSoap.GetElementsByTagName("s:Body")[0]);
98                outputSoap.GetElementsByTagName("s:Envelope")[0].AppendChild(outputSoap.ImportNode(soap.GetElementsByTagName("s:Body")[0],true));
99            }
100        }
101
102        public void createErrorMessage(string text)
103        {
104            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(text, this, NotificationLevel.Error));
105        }
106
107        public void createInfoMessage(string text)
108        {
109            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(text, this, NotificationLevel.Info));
110        }
111
112        [PropertyInfo(Direction.OutputData, "SOAP Output", "Output a modified SOAP message to be processed by the Web Service", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Text, "XmlConverter")]
113         public XmlDocument OutputString
114        {
115            get {
116                outputSoap=(XmlDocument) inputSoap.Clone();
117                if (!this.wrapper)
118                {
119                    send = true;
120                    return this.outputSoap;
121                }
122                else
123                {
124                    send = true;
125                    wrapperAttackOnBody();
126                    return outputSoap;
127                }
128
129            }
130            set
131            { 
132               
133                this.outputSoap = value;
134                OnPropertyChanged("OutputString");
135            }
136        }
137
138        [PropertyInfo(Direction.InputData, "SOAP Input", "Input from a Web-Service Client", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Text, "XmlOutputConverter")]
139        public XmlDocument InputString
140        {
141            get { return this.inputSoap; }
142            set
143            {
144               
145                    this.inputSoap = value;
146               
147                OnPropertyChanged("InputString");
148                OnPropertyChanged("OutputString");
149            }
150        }
151
152        [PropertyInfo(Direction.InputData, "SOAP Input", "Soap Message response from a Web-Service", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Text, "XmlOutputConverter")]
153        public XmlDocument InputAnswer
154        {
155            get { return this.inputAnswer; }
156            set
157            {
158                this.inputAnswer = value;
159                OnPropertyChanged("InputAnswer");
160            }
161        }
162
163        [PropertyInfo(Direction.ControlSlave, "WSDL Input", "WSDL to create the soap message",null, DisplayLevel.Beginner)]
164        public XmlDocument wsdlInput
165        {
166            get { return this.wsdl; }
167            set
168            {
169                presentation.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
170                {
171                    string s = xmlToString(value);
172                    loadWSDL(s);
173                    OnPropertyChanged("wsdlInput");
174                    createInfoMessage("Received WSDL File");
175                }, null);
176            }
177        }
178
179        public void loadWSDL(string wsdlString)
180        {
181            if (!wsdlString.Equals(""))
182            {
183                StringReader sr = new StringReader(wsdlString);
184                XmlTextReader tx = new XmlTextReader(sr);
185
186                ServiceDescription t = ServiceDescription.Read(tx);
187                // Initialize a service description importer.
188
189                ServiceDescription serviceDescription = t.Services[0].ServiceDescription;
190                Types types = serviceDescription.Types;
191                PortTypeCollection portTypes = serviceDescription.PortTypes;
192                MessageCollection messages = serviceDescription.Messages;
193                XmlSchema schema = types.Schemas[0];
194                PortType porttype = portTypes[0];
195                Operation operation = porttype.Operations[0];
196                OperationInput input = operation.Messages[0].Operation.Messages.Input;
197                Message message = messages[input.Message.Name];
198
199                MessagePart messagePart = message.Parts[0];
200                //        XmlSchemaObject fsdf = types.Schemas[0].Elements[messagePart.Element];
201                XmlSchema fsdf = types.Schemas[0];
202                if (fsdf == null)
203                {
204                    Console.WriteLine("Test");
205                }
206                StringWriter twriter = new StringWriter();
207                //  TextWriter writer= new TextWriter(twriter);
208                fsdf.Write(twriter);
209                DataSet set = new DataSet();
210                StringReader sreader = new StringReader(twriter.ToString());
211                XmlTextReader xmlreader = new XmlTextReader(sreader);
212                set.ReadXmlSchema(xmlreader);
213 
214                soap = new XmlDocument();
215                XmlNode node,envelope,header, body, securityHeader;
216                node = soap.CreateXmlDeclaration("1.0", "ISO-8859-1", "yes");
217
218                soap.AppendChild(node);
219                envelope = soap.CreateElement("s", "Envelope", "http://www.w3.org/2003/05/soap-envelope");
220
221
222                soap.AppendChild(envelope);
223
224                body = soap.CreateElement("s", "Body", "http://www.w3.org/2003/05/soap-envelope");
225                XmlNode eingabe = soap.CreateElement("tns", set.Tables[0].ToString(), set.Tables[0].Namespace);
226                DataTable table = set.Tables[0];
227                foreach (DataColumn tempColumn in table.Columns)
228                {
229                    XmlNode neu = soap.CreateElement("tns", tempColumn.ColumnName, set.Tables[0].Namespace);
230                    eingabe.AppendChild(neu);
231                }
232                body.AppendChild(eingabe);
233                envelope.AppendChild(body);
234                mySettings.Soap = xmlToString(soap);
235            }
236        }
237
238        public void showsoapBody()
239        {
240            XmlNode rootElement = soap.SelectSingleNode("/*");
241            presentation.soapItem = new System.Windows.Controls.TreeViewItem();
242
243
244            presentation.soapItem.IsExpanded = true;
245
246            StackPanel panel1 = new StackPanel();
247
248            panel1.Orientation = System.Windows.Controls.Orientation.Horizontal;
249
250
251            TextBlock elem1 = new TextBlock();
252            elem1.Text = "Insert your values:";
253
254
255
256            panel1.Children.Insert(0, elem1);
257
258            presentation.soapItem.Header = panel1;
259
260            presentation.CopyXmlToTreeView(soap.GetElementsByTagName("s:Body")[0], ref presentation.soapItem, this.getParameter());
261            presentation.treeView.Items.Clear();
262            presentation.treeView.Items.Add(presentation.soapItem);
263            this.outputSoap = this.soap;
264            OnPropertyChanged("OutputString");
265        }
266
267
268        public XmlNode[] getParameter()
269        {
270            ArrayList list = new ArrayList();
271            foreach (XmlNode node in soap.GetElementsByTagName("s:Body")[0].ChildNodes[0].ChildNodes)
272            {
273
274                list.Add(node);
275            }
276            XmlNode[] nodeset = new XmlNode[list.Count];
277            for (int i = 0; i < list.Count; i++)
278            {
279                nodeset[i] = (XmlNode)list[i];
280            }
281            return nodeset;
282        }
283
284
285
286
287
288        public Object XmlOutputConverter(Object Data)
289        {
290            string test = Data.ToString();
291
292            XmlDocument doc = (XmlDocument)this.outputSoap;
293            StringWriter t= new StringWriter();
294            Object obj = new Object();
295            try
296            {
297                XmlTextWriter j = new XmlTextWriter(t);
298                j.Formatting = Formatting.Indented;
299                doc.WriteContentTo(j);
300                obj = (Object)t.ToString();
301            }
302            catch (Exception e)
303            {
304                Console.WriteLine(e.ToString());
305
306            }
307            return obj;
308        }
309
310        private ManInTheMiddleSettings mySettings
311        {
312            get { return (ManInTheMiddleSettings)this.settings; }
313        }
314
315        void settings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
316        {
317           ManInTheMiddleSettings s = (ManInTheMiddleSettings)sender;
318            switch (e.PropertyName)
319            {
320                case "insertBody":
321                    wrapper = s.insertBody;
322                    if ((wrapper) && (s.Soap!=""))
323                    {
324                        this.showsoapBody();
325                    }
326                    else
327                    {
328                        presentation.treeView.Items.Clear();
329                    }
330                    break;
331                case "Soap":
332                    if (s.Soap != "")
333                    {
334                        soap = stringToXml(s.Soap);
335                        if (wrapper)
336                        {
337                            this.showsoapBody();
338                        }
339                    }
340                    break;
341
342            }
343        }
344
345        public string xmlToString(XmlDocument doc)
346        {
347
348            if (doc != null)
349            {
350                StringWriter sw = new StringWriter();
351                doc.Normalize();
352                XmlTextWriter tx = new XmlTextWriter(sw);
353                tx.Formatting = Formatting.Indented;
354                doc.WriteContentTo(tx);
355                return sw.ToString();
356            }
357            else
358            {
359                return "";
360            }
361        }
362
363        public XmlDocument stringToXml(string s)
364        {
365            XmlDocument doc = new XmlDocument();
366            if (!s.Equals(""))
367            {
368                StringReader sr = new StringReader(s);
369                XmlTextReader tx = new XmlTextReader(sr);
370                doc.Load(tx);
371            }
372            return doc;
373        }
374
375        #region IPlugin Member
376
377        public void Dispose()
378        {
379
380        }
381
382        public void Execute()
383        {
384            if (!send)
385            {
386                OnPropertyChanged("OutputString");
387            }
388            else { send = false; }
389     
390        }
391
392        public void Initialize()
393        {
394
395        }
396
397        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
398
399        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
400
401        public event StatusChangedEventHandler OnPluginStatusChanged;
402
403        public void Pause()
404        {
405
406        }
407
408        public void PostExecution()
409        {
410
411        }
412
413        public void PreExecution()
414        {
415
416        }
417
418        public System.Windows.Controls.UserControl Presentation
419        {
420            get { return this.presentation; }
421        }
422
423        public System.Windows.Controls.UserControl QuickWatchPresentation
424        {
425            get { return null; }
426        }
427
428        public ISettings Settings
429        {
430            get { return this.settings; }
431        }
432
433        protected void OnPropertyChanged(string name)
434        {
435            EventsHelper.PropertyChanged(PropertyChanged, this, new PropertyChangedEventArgs(name));
436
437
438
439        }
440
441        public void Stop()
442        {
443            send = false;
444        }
445
446        #endregion
447
448       
449
450        #region INotifyPropertyChanged Member
451
452        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
453
454       
455
456
457        #endregion
458    }
459}
Note: See TracBrowser for help on using the repository browser.