View Javadoc
1   package com.jsql.view.subscriber;
2   
3   import com.jsql.model.injection.strategy.AbstractStrategy;
4   import com.jsql.model.injection.strategy.StrategyError;
5   import com.jsql.util.LogLevelUtil;
6   import com.jsql.view.swing.panel.consoles.NetworkTable;
7   import com.jsql.view.swing.terminal.AbstractExploit;
8   import com.jsql.view.swing.util.MediatorHelper;
9   import org.apache.logging.log4j.LogManager;
10  import org.apache.logging.log4j.Logger;
11  
12  import javax.swing.table.DefaultTableModel;
13  import java.awt.*;
14  import java.util.Arrays;
15  import java.util.UUID;
16  
17  public class SubscriberView extends AbstractSubscriber {
18  
19      private static final Logger LOGGER = LogManager.getRootLogger();
20  
21      @Override
22      protected void execute(Seal request) {
23          this.addLog(request);
24          this.progress(request);
25          this.executeInjection(request);
26          this.createTab(request);
27          this.executeExploit(request);
28      }
29  
30      private void executeInjection(Seal request) {
31          switch (request) {
32              case Seal.ActivateEngine r -> MediatorHelper.panelAddressBar().getPanelTrailingAddress().setEngine(r.engine());
33              case Seal.AddColumns(var columns) -> MediatorHelper.treeDatabase().addColumns(columns);
34              case Seal.AddTables(var tables) -> MediatorHelper.treeDatabase().addTables(tables);
35              case Seal.AddDatabases(var databases) -> MediatorHelper.treeDatabase().addDatabases(databases);
36  
37              case Seal.MarkStrategyInvulnerable(int indexError, AbstractStrategy strategy) -> {
38                  if (strategy instanceof StrategyError) {
39                      MediatorHelper.panelAddressBar().getPanelTrailingAddress().markInvulnerable(indexError, strategy);
40                  } else {
41                      MediatorHelper.panelAddressBar().getPanelTrailingAddress().markInvulnerable(strategy);
42                  }
43              }
44              case Seal.MarkStrategyVulnerable(int indexError, var strategy) -> {
45                  if (strategy instanceof StrategyError) {
46                      MediatorHelper.panelAddressBar().getPanelTrailingAddress().markVulnerable(indexError, strategy);
47                  } else {
48                      MediatorHelper.panelAddressBar().getPanelTrailingAddress().markVulnerable(strategy);
49                  }
50              }
51              case Seal.ActivateStrategy(var strategy) -> MediatorHelper.panelAddressBar().getPanelTrailingAddress().activateStrategy(strategy);
52  
53              case Seal.MarkFileSystemInvulnerable ignored -> MediatorHelper.tabManagersCards().markFileSystemInvulnerable();
54              case Seal.MarkFileSystemVulnerable ignored -> MediatorHelper.tabManagersCards().markFileSystemVulnerable();
55              default -> {
56                  // ignore
57              }
58          }
59      }
60  
61      private void executeExploit(Seal request) {
62          switch (request) {
63              case Seal.AddTabExploitSql(var urlSuccess, var username, var password) -> MediatorHelper.tabResults().addTabExploitSql(urlSuccess, username, password);
64              case Seal.AddTabExploitUdf r -> MediatorHelper.tabResults().addTabExploitUdf(r.biConsumerRunCmd());
65              case Seal.AddTabExploitWeb(String urlSuccess) -> MediatorHelper.tabResults().addTabExploitWeb(urlSuccess);
66              case Seal.GetTerminalResult(UUID uuidShell, String result) -> {
67                  AbstractExploit terminal = MediatorHelper.frame().getMapUuidShell().get(uuidShell);
68                  if (terminal != null) {  // null on reverse shell connection
69                      terminal.append(result);
70                      terminal.append("\n");
71                      terminal.reset();
72                  }
73              }
74              default -> {
75                  // ignore
76              }
77          }
78      }
79  
80      private void addLog(Seal request) {
81          switch (request) {
82              case Seal.MessageBinary(var message) -> {
83                  MediatorHelper.panelConsoles().messageBinary(message);
84                  MediatorHelper.tabConsoles().setBold("Boolean");
85              }
86              case Seal.MessageChunk(var message) -> {
87                  MediatorHelper.panelConsoles().messageChunk(message);
88                  MediatorHelper.tabConsoles().setBold("Chunk");
89              }
90              case Seal.MessageHeader r -> {
91                  NetworkTable table = MediatorHelper.panelConsoles().getNetworkTable();
92                  table.addHeader(r);
93                  DefaultTableModel model = (DefaultTableModel) table.getModel();
94                  try {
95                      model.addRow(new Object[] {
96                          r.url(),
97                          r.size(),
98                          r.metadataStrategy(),
99                          Arrays.asList(r.metadataProcess(), r.metadataBoolean())
100                     });
101 
102                     Rectangle rect = table.getCellRect(table.getRowCount() - 1, 0, true);
103                     table.scrollRectToVisible(rect);
104 
105                     MediatorHelper.tabConsoles().setBold("Network");
106                 } catch(NullPointerException | IndexOutOfBoundsException e) {
107                     // Fix #4658, #2224, #1797 on model.addRow()
108                     LOGGER.log(LogLevelUtil.CONSOLE_JAVA, e, e);
109                 }
110             }
111             default -> {
112                 // ignore
113             }
114         }
115     }
116 
117     private void createTab(Seal request) {
118         switch (request) {
119             case Seal.CreateAdminPageTab(String urlSuccess) -> MediatorHelper.tabResults().addAdminTab(urlSuccess);
120             case Seal.CreateAnalysisReport(var content) -> MediatorHelper.tabResults().addReportTab(content.trim());
121             case Seal.CreateFileTab(var name, var content, var path) -> MediatorHelper.tabResults().addFileTab(name, content, path);
122             case Seal.CreateValuesTab(var columns, var table, var tableBean) -> MediatorHelper.treeDatabase().createValuesTab(table, columns, tableBean);
123             default -> {
124                 // ignore
125             }
126         }
127     }
128 
129     private void progress(Seal request) {
130         switch (request) {
131             case Seal.StartIndeterminateProgress(var table) -> MediatorHelper.treeDatabase().startIndeterminateProgress(table);
132             case Seal.StartProgress(var elementDatabase) -> MediatorHelper.treeDatabase().startProgress(elementDatabase);
133             case Seal.UpdateProgress(var database, var countProgress) -> MediatorHelper.treeDatabase().updateProgress(database, countProgress);
134             case Seal.EndIndeterminateProgress(var table) -> MediatorHelper.treeDatabase().endIndeterminateProgress(table);
135             case Seal.EndPreparation ignored -> {
136                 MediatorHelper.panelAddressBar().getPanelTrailingAddress().endPreparation();
137                 if (MediatorHelper.model().shouldErasePreviousInjection()) {
138                     MediatorHelper.tabManagersCards().endPreparation();
139                 }
140             }
141             case Seal.EndProgress(var elementDatabase) -> MediatorHelper.treeDatabase().endProgress(elementDatabase);
142             default -> {
143                 // ignore
144             }
145         }
146     }
147 }